Nginx

Nginx - 用重寫的 URL 填充 REQUEST_URI

  • September 28, 2016

我有一個用於新 PHP 應用程序的 Nginx 配置,它與另一個舊 PHP 應用程序具有相同的功能,但 URL 不同。

我想保留舊應用程序的路徑,將/foo路徑前綴/page替換為並將特殊路徑替換/foo/bar/page/otherBar

   # legacy support
   location ~ ^/foo/bar {
       rewrite /foo/bar /page/otherBar$1 last;
   }

   # How to rewrite all other pages starting with "/foo" ?

   # END legacy support

   location / {
       # try to serve file directly, fallback to front controller
       try_files $uri /index.php$is_args$args;
   }

   location ~ ^/index\.php(/|$) {
       proxy_read_timeout 300;
       include        fastcgi_params;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       fastcgi_param  SCRIPT_FILENAME /usr/share/nginx/www/$fastcgi_script_name;
       fastcgi_param  PATH_INFO       $fastcgi_path_info;
       fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_script_name;
       fastcgi_pass   unix:/var/run/php/php7.0-fpm.sock;
   }

這種方法不起作用,因為在包含文件中$request_uri傳遞給的.REQUEST_URI``fastcgi_params``/foo/bar

我嘗試設置REQUEST_URI為,$fastcgi_path_info但是對於所有未重寫的 URL 都失敗了,因為它是空的。$uri也不起作用,因為它只包含/index.php?

包含重寫路徑的第三個位置配置是否有任何變數?

$request_uri具有原始 URI$uri的值並具有最終 URI 的值。您可以使用該set指令保存塊$uri內部的快照,location /並稍後使用它來生成REQUEST_URI參數。

像這樣:

location / {
   set $save_uri $uri;
   try_files $uri /index.php$is_args$args;
}

location ~ ^/index\.php(/|$) {
   include  fastcgi_params;
   fastcgi_param  REQUEST_URI $save_uri;
   ...
}

有關更多資訊,請參閱此文件

引用自:https://serverfault.com/questions/805881