例如。 /荷兰/阿姆斯特丹/ car_rental成为/ nederland /阿姆斯特丹/汽车租赁。为此,我使用这里描述的技术:How to replace underscore to dash with Nginx.所以我的位置块匹配:
location ~ (_)
但是我只想在不在/ admin命名空间的URL上执行此操作。为了实现这一点,我尝试将正则表达式与负查询组合:Regular expression to match line that doesn’t contain a word?.现在位置与:
(?=^(?!\/admin))(?=([^_]*))
Rubular报告string / nederland / amsterdam / car_rental来匹配正则表达式,而/ admin / stats_dashboard不匹配,就像我想要的那样。但是,当我将这个规则应用到Nginx配置文件时,该站点将重定向循环。有什么我忽略了吗?
更新:我实际上并不想在/ admin命名空间中重写任何内容。下划线到破折号的重写应该仅在不在/ admin命名空间中的所有URL上进行。
有了这个知识,在你的鞋子中,我将简单地使用正则表达式定义一个位置,用于从你连接到的@L_301_3@获得的下划线。
location ~ (\badmin\b) { # Config to process urls containing "admin" } location ~ (_) { # Config to process urls containing "_" }
任何与管理员的请求都将由第一个位置块处理,无论它是否具有下划线,因为匹配的位置块出现在下划线之前。
** PS **
作为cnst发布的另一个答案,在我显示几天之后,我发布的位置匹配顺序的文档的链接也表示您也可以使用^〜修饰符来匹配/ admin文件夹,并跳过位置块下划线。
我个人倾向于不使用此修饰符,并喜欢将带正则表达式的位置与注释注释一起使用,但它肯定是一个选项。
但是,根据您的设置,您需要小心,因为以“/ admin”开头但是较长的请求可能与修饰符匹配并导致意想不到的结果。
如上所述,我更喜欢我的基于正则表达式的方法,因为知道没有人会开始任意地改变配置文件中的事物的顺序,而没有一个明确的理解。