NGINX 重写静态到动态路径

NGINX 重写静态到动态路径

我正在尝试将半静态 URL 路径重写为动态路径,但结果并不理想。坦白地说,我对 NGINX 和正则表达式还很陌生,所以请耐心等待。

我正在从此路径重定向:/locations/schedule-tour/locationnumber(这是一个实数,并且根据您正在查看的位置而动态变化)并且我希望它重定向到这样的路径:/位置/州/城市/地址-位置编号。我可以让地点编号和 #scheduletour 出现在新 URL 中,但我不知道如何让 URL 中的州/城市/地址部分出现。甚至查看服务器块中重写路径名也让我感到困惑,因为我不知道如何将其引入州/城市/地址鉴于其动态特性,我尝试编写一个重定向,而不是数千个。任何帮助都值得感激。

您可以在下面看到我尝试过的方法。但是,即使我可以更改路径名而不是重写,那么如何在 nginx 中动态捕获州/领地缩写、城市名称和地址?简单的重定向对我来说相对容易,但这个重定向却让我头疼。任何帮助都非常感谢!

我尝试过这个:

rewrite (?i)^/locations/schedule-tour/(\d+)$ /locations/$2--$1%23scheduletour permanent;

rewrite (?i)^/locations/schedule-tour/(\d+)$ /locations/(.*)--$1%23scheduletour permanent;

location = /locations/schedule-tour/(\d+)$ {
                return 301 /locations/[^/]/[^/]/[^/]--$1%23scheduletour;
            }

第二次尝试效果最好,但显然 URL 中显示的是 (.*) 而不是州/城市/地址/我真正需要的。

答案1

有趣的问题,到目前为止还没有答案...我会尽力帮助,但缺少一些信息...正如 djdomi 在评论中暗示的那样 - Nginx 如何知道正确的城市、州、地址?在这种情况下,“如何”准备了解决方案的范围。

假设有一张数据表,其中编号行 [locationnumber] 至少引用了 State、City、Address 等列。如果该数据可以检索为 $s、$c、$a,那么理论上可以构造一个新的 URI,如下所示:/locations/schedule-tour/$s/$c/$a--[locationnumber]%23scheduletour

您可以通过 URI 上的 Regex 中的 $1 获取 [locationnumber];缺少的是将 [locationnumber] 映射到其他所需数据的机制,以便构建正确的 URL。

因此,在 Nginx 中有一个 Map 组件,它可以接受静态输入并非常整齐地输出相应的静态字符串,准备注入重写的 URI。该代码块如下所示:

http {
    ...

    #first map here extracts the locationnumber from uri and sets $loc_num
    map $request_uri  $loc_num {
        ~^/locations/schedule-tour/(\d+)$  $1 ;
        default "" ;
    }
    #second map renders value in $loc_num as uri component
    map $loc_num $loc_uri {
        default "" ;
        123   /California/Dana_Point/One_Ritz-Carlton_Dr ;
        1234  /Oregon/Cannon_Beach/539_S_Hemlock_St ;   
        12345 /Hawaii/Kihei/3900_Wailea_Alanui_Dr ;
    }
    
    server {
        ...
        location *~ ^/locations/schedule-tour/(\d+) {
            #effectively concats the new uri with $loc_uri and extracted $1
            rewrite ~ ^(.*)$  /locations/schedule-tour$loc_uri--$1%23scheduletour ;
            ... 
        }
    }
}

根据上述代码,请求的 URL 为 https://my.server.com/locations/schedule-tour/1234 将被重写并呈现与请求相同的结果 https://my.server.com/locations/schedule-tour/Oregon/Cannon_Beach/539_S_Hemlock_St--1234#scheduletour

但是,“地图”解决方案可能会出现问题,具体取决于您的位置的规模……这意味着如果您有超过 50 个位置,或者这些位置会不断变化,那么静态地图可能不适合解决这个问题。从技术上讲,在地图中使用更多静态数据并没有错,即使超过 50 个,甚至是动态的……但现在我会根据规模来决定怎么做。我的意思是,谁想一直手动更新服务器配置?

这就是为什么我想知道位置号码如何转换为您需要的州/城市/地址。

对于更复杂的操作(大量动态旅游路线,或大量路线),在这种情况下,将使用数据库或至少一些表之类的东西来编目位置编号,有一个涉及 Lua 脚本的更复杂的解决方案。本质上,数据是通过 Lua 代码检索并通过 Lua 脚本提供的变量注入到 Rewrite 中,然后注入到生成的 uri 中……这并不复杂,但您将使用 Nginx 作为应用服务器,而不仅仅是代理。

这没有什么不对!

这个答案已经很长了,但我希望至少已经提出了几种不同的可行机制。

相关内容