如何调试 nginx 中的大型重定向链。意外重定向

如何调试 nginx 中的大型重定向链。意外重定向

我现在有一个任务,要进行大规模网站迁移。而且我的配置中有大量重定向。但我不明白为什么一个重定向会导致链中的第二个重定向。即使任何其他重定向都被注释/禁用。

所以我的位置配置是:

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。

答案1

您的try_files语句将 URI 重写为查询字符串/index.php并附加查询字符串。您的if ($is_args)语句使用查询字符串重定向任何 URI。您有一个重定向循环。

location ~* /index.php块无法区分包含的原始请求index.php和默认的结果try_files

您应该对变量执行测试$request_uri,该变量将始终包含原始请求和查询字符串。您可以使用if或 a map。如果有多个正则表达式,则 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 块之外。请参阅这个文件了解详情。

相关内容