Вопрос или проблема
Я хочу переписать URL
https://example.com/mapa/viewer/index.php?code=XXX&m=YYY
на https://example.com/XXX&m=YYY
Цель – переписать URL на содержимое встроенного iframe к родительскому сайту, предотвратить зацикливание
У меня есть конфигурация
#предотвращение зацикливания встроенного iframe
map $http_referer $is_internal_request {
default 0;
"~^https://example\.com/" 1;
}
location ~ ^/mapa/viewer/index\.php$ {
set $should_redirect 1;
if ($arg_code = "") {
set $should_redirect 0;
}
if ($is_internal_request) {
set $should_redirect 0;
}
if ($should_redirect = 1) {
return 301 https://example.com/$arg_code;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:{{php_fpm_port}};
}
но правило выше перенаправляет на https://example.com/XXX, а не на
https://example.com/XXX&m=YYY
Пожалуйста, помогите
Ответ или решение
Для решения задачи переписывания URL в Nginx, необходимо обновить конфигурацию таким образом, чтобы в новый URL добавлялись все параметры запроса, включая не только code
(как это сделано в вашей текущей конфигурации), но и остальные параметры, такие как m
.
Теория: В Nginx для переписывания URL с сохранением параметров используется директива rewrite
. В текущем примере вы пытаетесь учитывать параметры запроса code
и m
. Однако, ваше правило конфигурации не включает параметр m
в новый URL, что в итоге приводит к ошибке.
Пример: Для корректной реализации переписывания URL, необходимо внести изменения в секцию конфигурации location
. Вместо использования директивы return
, которая ограниченно поддерживает параметры запроса, следует использовать директиву rewrite
вместе с переменной $request_uri
, чтобы сохранить все исходные параметры запроса. Пример решения может выглядеть так:
map $http_referer $is_internal_request {
default 0;
"~^https://example\.com/" 1;
}
location ~ ^/mapa/viewer/index\.php$ {
set $should_redirect 1;
if ($arg_code = "") {
set $should_redirect 0;
}
if ($is_internal_request) {
set $should_redirect 0;
}
if ($should_redirect = 1) {
# Использование $query_string для сохранения всех параметров
rewrite ^/mapa/viewer/index\.php$ /$arg_code?$query_string? permanent;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:{{php_fpm_port}};
}
Применение: Что данный код делает? Если запрос поступает извне и содержит параметр code
, происходит перенаправление на указанный в code
новый путь, включая все параметры из исходного URL через $query_string
. Это решение исправляет вашу проблему, добавляя параметр m
(и любые другие параметры) в целевой URL. Запрещается перенаправление для внутренних (из вашей же доменной зоны) запросов и если параметр code
отсутствует.
Продуманный подход к настройке URL переписывания может значительно улучшить работу ваших интернет-сервисов, позволив управлять навигацией пользователей.