Nginx: Как переписать аргументы, передаваемые в URL php?

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

В Nginx я пытаюсь перенаправить

example.com/app/index.php/view/proj?repository=oldrepo&file=oldfile#coord=...

на:

example.com/app/index.php/view/proj?repository=newrepo&file=newfile#coord=...

Перехватывая два аргумента и проверяя их, перенаправление, кажется, работает, так как URL изменяется. Однако PHP-страница не обслуживается.

return 301 в блоке location может быть не правильным подходом.

У кого-нибудь есть идеи, как действовать дальше? Спасибо!

server {
    listen 80;

    server_name example.com;
    root /var/www/html/app;

    index index.php index.html index.htm;

    # настройка сжатия
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 100;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript text/json;

     location /app/index.php/view/proj {
       if ($args = "repository=oldrepo&file=oldfile")  {
           return 301 /app/index.php/view/proj?repository=newrepo&file=newfile;
       }
     }

     location /app/ {
        alias /var/www/html/app/;
        index index.php;

        location ~ [^/]\.php(/|$) {
                fastcgi_split_path_info ^(.+\.php)(/.*)$;
                set $path_info $fastcgi_path_info;
                try_files $fastcgi_script_name =404;
                include fastcgi_params;

                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $request_filename;
                #$document_root$fastcgi_script_name;
                #$request_filename;
                fastcgi_param PATH_INFO $path_info;
                fastcgi_param PATH_TRANSLATED $path_info;
                fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
                fastcgi_param SERVER_NAME $http_host;
        }
     }
}

Ответ или решение

Вопрос о том, как перенаправить аргументы, переданные в URL для PHP в Nginx, требует детального рассмотрения и понимания несколько аспектов конфигурации Nginx. Давайте разберемся, как можно эффективно решить данную задачу.

Теория

Nginx — это мощный веб-сервер, который поддерживает различные функции, в том числе переписывание URL и аргументов, а также эффективное взаимодействие с веб-приложениями через FastCGI. В данном случае, автор вопроса хочет заменить определенные параметры в строке запроса и столкнулся с проблемой использования директивы return 301, которая просто осуществляет перенаправление и может не подходить для решения задачи.

Когда речь идет о переписывании URL, Nginx предоставляет несколько инструментов, таких как использование регулярных выражений (rewrite) и условных конструкций (if). Основные элементы, которые нужно учитывать:

  • Распознавание и замена строк запроса: Необходимо определить, как правильно отловить нужные параметры в строке запроса.

  • Использование регулярных выражений: Это может потребоваться, если необходимо выполнить более сложное соответствие и замену.

  • Правильная обработка PHP-скриптов: Важно убедиться, что после переписывания аргументов, Nginx корректно передает запрос в FastCGI, чтобы PHP-страница была отдана корректно.

Пример

Исходная конфигурация использует условие if для проверки аргументов и устанавливает возврат с кодом 301. Проблема с таким подходом заключается в том, что 301 – это постоянное перенаправление, которое не оставляет дальнейшего пути для обработки PHP-скрипта.

Вместо этого, можно использовать директиву rewrite в сочетании с блоком обработки PHP-запросов, чтобы гарантировать, что скрипт будет вызван после переписывания URL. Вот пример изменения конфигурации:

server {
    listen 80;

    server_name example.com;
    root /var/www/html/app;

    index index.php index.html index.htm;

    # compression setting
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 5;
    gzip_min_length 100;
    gzip_http_version 1.1;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript text/json;

    location /app/index.php/view/proj {
        # Проверяем условия, чтобы переписать аргументы
        if ($arg_repository = "oldrepo") {
            set $new_repository "newrepo";
        }
        if ($arg_file = "oldfile") {
            set $new_file "newfile";
        }

        # Переписываем строку запроса и отправляем на CGI
        rewrite ^(.+)$ $1?repository=$new_repository&file=$new_file last;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include fastcgi_params;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Применение

  1. Установка новых значений аргументов: Использование set позволяет сохранить новые значения аргументов, которые затем можно передать в rewrite.

  2. Директива rewrite: Она переписывает URL на основе шаблона регулярного выражения. В нашем случае мы просто добавляем новые параметры в строку запроса.

  3. FastCGI и обработка PHP: обеспечиваем передачу запроса PHP интерпретатору через FastCGI. Используем fastcgi_param для установки необходимых параметров окружения.

  4. Устранение лишних переписывателей или редиректов: исключите ненужные директивы return, которые могут закончить обработку запроса до достижения FastCGI.

Заключение

Данное решение направлено на эффективное переписывание аргументов строки запроса в Nginx, сохраняя при этом работу PHP-скрипта. Этот подход позволяет избежать ненужных редиректов и корректно обрабатывать запросы, обеспечивая при этом сохранение параметров, которые могут быть изменены на стороне клиента. Важно помнить о том, что использование rewrite в Nginx требует понимания регулярных выражений и может нуждаться в дополнительных настройках, зависящих от структуры веб-приложения.

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

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