两个重写 url 规则之间的混淆

confusion between two rewrite urls rules

这两个规则混淆了:

RewriteRule ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ search.php?city=&speciality= [L] 
RewriteRule ^health-institute-app-([a-zA-Z\-]+)$ search.php?city= [L]

当我想达到 health-institute-app-mycity(第二条规则)时,服务器将 app 视为一个值并尝试达到 search.php?city=app&speciality=mycity(第一条规则)

我怎么能说这是两个不同的规则呢?

是的,因为第一条规则中的正则表达式 ^health-institute-([a-zA-Z\-]+)-([a-zA-Z\-]+)$ 也匹配 health-institute-app-mycity.

您需要颠倒这两个指令,以便更具体的规则在前。

例如:

RewriteRule ^health-institute-app-([a-zA-Z-]+)$ search.php?city= [L]
RewriteRule ^health-institute-([a-zA-Z-]+)-([a-zA-Z-]+)$ search.php?city=&speciality= [L] 

(在字符 class 的开头或结尾不需要反斜杠转义连字符。)

但是,(现在)第二条规则中的正则表达式可能不明确,因为连字符 (-) 用于分隔两个值(cityspeciality),但是连字符也包含在字符 classes 中,因此它可能是值本身的一部分。但是,city speciality 都不能同时包含连字符,尽管正则表达式似乎允许这样做。

例如,health-institute-foo-bar-baz-qux的请求应该如何解决?由于量词 +greedy,目前这将导致 search.php?city=foo-bar-baz&speciality=qux。如果 speciality 中有连字符(正如正则表达式所建议的那样),它将永远不会被匹配。