Назад | Перейти на главную страницу

Правило перезаписи nginx, чтобы также перезаписать $ uri

У меня есть 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;
}