У меня есть рабочая конфигурация php fastcgi в nginx. Теперь у меня есть несколько запросов, таких как /X.php
по /X
, /Y.php
по /Y
Звучит просто, поэтому для тестирования я написал следующее:
rewrite ^/X.php$ /api/v1/stat last;
он был пойман обработчиком 404 приложения php. вот журнал ошибок nginx с rewrite_log на
[notice] 15289#0: *759 "^/X.php$" matches "/X.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
[notice] 15289#0: *759 rewritten data: "/api/v1/stat", args: "", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
[notice] 15289#0: *759 "^/X.php$" does not match "/index.php", client: 10.0.0.12, server: example.com, request: "GET /X.php HTTP/1.1", host: "example.com"
Если я захожу напрямую в / api / v1 / stat, он работает:
[notice] 15125#0: *708 "^/X.php$" does not match "/api/v1/stat", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com"
[notice] 15125#0: *708 "^/X.php$" does not match "/index.php", client: 223.104.3.248, server: example.com, request: "GET /api/v1/stat HTTP/1.1", host: "example.com"
Вот моя связанная конфигурация nginx:
rewrite ^/X.php$ /api/v1/stat last;
location / {
try_files $uri $uri/ /index.php;
}
location ~ .*\.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
upstream php {
server unix:/var/run/php-fpm.sock;
}
Пожалуйста, помогите мне найти решение. Спасибо.
НОТА
Небольшая предыстория, которая может помочь вам понять мою проблему.
Вероятно, очевидно, что следующее должно работать, и оно работает:
rewrite ^/X.php$ /api/v1/stat permanent;
Однако я имею дело с каким-то оборудованием, которое не понимает перенаправление 301, поэтому я пытаюсь использовать внутреннее перенаправление, не показывая перенаправление.
ОБНОВЛЕНИЕ 1
Решение, которое я придумал, - это всего лишь половина. я получил /X.php
перенаправить на /api/v1/stat
хорошо. Однако после перенаправления нельзя передавать параметры. думаю rewrite
пройдет по $args
но это не работает. Я сейчас в растерянности ..
ОБНОВЛЕНИЕ 2
Задача решена. хотя я все еще не уверен, почему $args
не проходит.
Включение режима отладки nginx и сравнение журнала рабочего запроса с неудавшимся дает мне ключ к разгадке: nginx для неудавшегося запроса REQUEST_URI
переменная /X.php
и не обновлялся даже после перезаписи. видеть nginx doc по переменным
Так что мне нужно обновить REQUEST_URI
после переписывания. эта почта от SO помогает в этом.
Вот что мне подходит:
set $request_url $request_uri;
if ($request_uri ~ ^/X.php(.*)$ ) {
set $request_url /api/v1/x$1;
rewrite ^/X.php /api/v1/x last;
}
location ~ .*\.php$ {
try_files $uri =404;
include fastcgi_params;
fastcgi_pass php;
fastcgi_index index.php;
fastcgi_param REQUEST_URI $request_url;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
ОБНОВИТЬ
наконец, это работает и со строкой запроса при перезаписи. Я добавил соответствующую строку запроса в if
предложение и добавьте соответствующую строку запроса в request_url
. задача решена.
перезаписать ^ / X.php $ / api / v1 / stat последним; отправляет вас в "место /"
например, вы можете использовать другое местоположение для сопоставления этого внутреннего перенаправления: "/ api / v1 / stat"
В этом месте вы можете передать запрос в fcgi-backend (или дополнительно изменить его в этом месте).