我希望将所有带有下划线的 URL 重定向到其对应的虚线。
E.g. /nederland/amsterdam/car_rental
变成/nederland/amsterdam/car-rental
。为此,我使用此处描述的技术:如何使用 Nginx 将下划线替换为破折号 https://stackoverflow.com/questions/15912191/how-to-replace-underscore-to-dash-with-nginx/15934256#15934256。所以我的位置块匹配:
location ~ (_)
But I only想要在 URL 上执行此操作not in the /admin
命名空间。为了实现这一点,我尝试将正则表达式与负查找结合起来:正则表达式匹配不包含单词的行? https://stackoverflow.com/questions/406230/regular-expression-to-match-line-that-doesnt-contain-a-word/5334825#5334825。该位置现在与:
(?=^(?!\/admin))(?=([^_]*))
Rubular 报告字符串/nederland/amsterdam/car_rental
匹配正则表达式,同时/admin/stats_dashboard
不匹配,正如我想要的那样。然而,当我将此规则应用于 nginx 配置时,该站点最终会陷入重定向循环。有什么是我忽略的吗?
更新:我实际上不想重写任何内容/admin
命名空间。下划线到破折号的重写只能在所有 URL 上进行not in the /admin
命名空间。
The Nginx位置匹配顺序 http://nginx.org/en/docs/http/ngx_http_core_module.html#location使用正则表达式定义的位置按照其在配置文件中出现的顺序进行检查,并且正则表达式的搜索在第一个匹配时终止。
有了这些知识,站在您的立场上,我将简单地使用“admin”的正则表达式定义一个位置,该位置位于您从堆栈溢出答案 https://stackoverflow.com/questions/15912191/how-to-replace-underscore-to-dash-with-nginx/15934256#15934256你链接到。
location ~ (\badmin\b) {
# Config to process urls containing "admin"
}
location ~ (_) {
# Config to process urls containing "_"
}
任何请求admin
其中,无论是否有下划线,都会由第一个位置块处理,因为匹配的位置块出现在下划线之前。
** PS **
正如 cnst 在我的几天后发布的另一个答案所示,我发布的位置匹配订单文档的链接也表明您也可以使用^~
修饰符来匹配/admin
文件夹并跳过下划线的位置块。
我个人倾向于不使用此修饰符,并且更喜欢将基于正则表达式的位置与带注释的注释结合在一起,但这当然是一个选项。
但是,您需要小心,具体取决于您的设置,因为以“/admin”开头但更长的请求可能会与修饰符匹配并导致意外结果。
如前所述,我更喜欢基于正则表达式的安全方法,因为我知道没有人会在没有明确理解的情况下开始任意更改配置文件中的内容顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)