Переписать с аргументами в Nginx

Вопрос или проблема

Я хочу переписать 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 переписывания может значительно улучшить работу ваших интернет-сервисов, позволив управлять навигацией пользователей.

Оцените материал
Добавить комментарий

Капча загружается...