Nginx

如何在 nginx 中調試大重定向鏈。意外重定向

  • December 13, 2018

我現在的任務是進行大型站點遷移。而且我在配置中有大量重定向。但我不明白為什麼一個重定向會導致鏈中的第二個重定向。即使任何其他重定向評論/禁用。

所以我的位置配置:

server {

...
index index.php;

location / {
   try_files $uri $uri/ /index.php?$query_string;
}
location ~* /index.php {
   if ($args ~ "^page=flights&start_city=([\+\w\d\s]*)(&.*)?$"){
       return 301 $scheme://$server_name/flights?departure_city=$arg_start_city;
   }
   if ($is_args){
       return 301 $scheme://$server_name/$1;
   }

   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
   fastcgi_index index.php;
   include fastcgi_params;
}

我期待什麼?我希望舊連結喜歡

https://example.com/index.php?page=flights&start_city=Berlin&s_loc_lat=&s_loc_long=

變得:

https://example.com/flights?departure_city=Berlin

同時連結如下:

https://example.com/index.php?someoldpar=someoldkey&someoldpar2=someoldkey2

變得:

   https://example.com/

測試此配置時我得到了什麼?

. 我得到了第一個連結的重定向鏈:

1. GET https://example.com/index.php?page=flights&start_city=Berlin&s_loc_lat=&s_loc_long=
2. 301 https://example.com/flights?departure_city=Berlin
3. 301 https://example.com/

如何為已重定向的連結排除第 3 步?後端下的 Lavarel。

您的try_files語句將 URI 重寫為/index.php並附加查詢字元串。您的if ($is_args)語句使用查詢字元串重定向任何 URI。你有一個重定向循環。

location ~* /index.php塊無法區分包含的原始請求index.phptry_files預設值的結果。

您應該對$request_uri變數執行測試,該變數將始終包含原始請求和查詢字元串。您可以使用ifmap。對於多個正則表達式,amap是首選解決方案。

例如:

map $request_uri $redirect {
   default 0;
   ~^/index.php\?page=flights&start_city=(?<startcity>[\+\w\d\s]*)(&.*)?$ /flights?departure_city=$startcity;
   ~^/index.php\?                                                         /;
}

server {
   ...
   if ($redirect) {
       return 301 $redirect;
   }

您可以刪除您的location ~* /index.php塊,因為它不再需要。正則表達式按順序計算,直到找到匹配的規則,因此將最具體的規則排在最前面,最後將最不具體的規則排序。使用命名擷取,因為數字擷取可能超出範圍。如果它們相同,則不需要指定方案或域名。該map指令位於 `server 塊之外。有關詳細資訊,請參閱此文件

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