Вопрос или проблема
В 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;
}
}
Применение
-
Установка новых значений аргументов: Использование
set
позволяет сохранить новые значения аргументов, которые затем можно передать вrewrite
. -
Директива
rewrite
: Она переписывает URL на основе шаблона регулярного выражения. В нашем случае мы просто добавляем новые параметры в строку запроса. -
FastCGI и обработка PHP: обеспечиваем передачу запроса PHP интерпретатору через FastCGI. Используем
fastcgi_param
для установки необходимых параметров окружения. -
Устранение лишних переписывателей или редиректов: исключите ненужные директивы
return
, которые могут закончить обработку запроса до достижения FastCGI.
Заключение
Данное решение направлено на эффективное переписывание аргументов строки запроса в Nginx, сохраняя при этом работу PHP-скрипта. Этот подход позволяет избежать ненужных редиректов и корректно обрабатывать запросы, обеспечивая при этом сохранение параметров, которые могут быть изменены на стороне клиента. Важно помнить о том, что использование rewrite
в Nginx требует понимания регулярных выражений и может нуждаться в дополнительных настройках, зависящих от структуры веб-приложения.