У меня есть URL типа ^/d/something/(.*)$
, я хочу переписать его внутренне, без постоянного или временного перенаправления HTTP, чтобы $_SERVER['REQUEST_URI']
будет только $1
а не весь ^/d/something/(.*)$
. Используя nginx.
Вот что я пробовал:
location /d/something/ {
rewrite "^/d/something/(.*)$" /$1 last;
}
location / {
include php-fcgi.conf;
try_files $uri $uri/ /index.php$args;
}
в php-fcgi.conf
Там есть fastcgi_param REQUEST_URI $request_uri;
и $request_uri
остается прежним, поэтому когда я ударил /d/something/something2
symfony reouter, который использует $_SERVER['REQUEST_URI']
показывает /d/something/something2
пока я ожидаю, что это будет просто /something2
. Я предполагаю это потому что $request_uri
не изменено.
Если я заменю его на fastcgi_param REQUEST_URI $uri;
затем $_SERVER['REQUEST_URI']
становится /
, что бы я ни отправил something2
часть, это всегда просто /
. Почему это происходит и как я могу внутренне переписать это на /$1
?
Спасибо!
ОБНОВИТЬ: вот содержание php-fcgi.conf
:
location ~ \.php {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 60s;
}
Я ожидал $uri
иметь ценность /index.php
к тому времени, когда запрос передается в скрипт PHP, я не понимаю, почему вы видите /
. Тем не мение...
Самым простым решением было бы выполнить скрипт PHP изнутри location
где переписывается URI. Это достигается с помощью rewrite...break
и перезапись параметров REQUEST_URI и SCRIPT_FILENAME.
Например:
location /d/something/ {
rewrite "^/d/something/(.*)$" /$1 break;
include fastcgi_params;
fastcgi_param REQUEST_URI $uri;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 60s;
}
Поместите fastcgi_param
заявления после то include
заявление.
В качестве альтернативы используйте регулярное выражение location
блок. Обратите внимание, что порядок регулярное выражение location
блоков имеет значение. Видеть этот документ для подробностей.
Например:
location ~ ^/d/something(/.*)$ {
try_files /index.php =404;
include fastcgi_params;
fastcgi_param REQUEST_URI $1;
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 60s;
}