两个重写 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 的开头或结尾不需要反斜杠转义连字符。)
但是,(现在)第二条规则中的正则表达式可能不明确,因为连字符 (-
) 用于分隔两个值(city
和 speciality
),但是连字符也包含在字符 classes 中,因此它可能是值本身的一部分。但是,city
和 speciality
都不能同时包含连字符,尽管正则表达式似乎允许这样做。
例如,health-institute-foo-bar-baz-qux
的请求应该如何解决?由于量词 +
是 greedy,目前这将导致 search.php?city=foo-bar-baz&speciality=qux
。如果 speciality
中有连字符(正如正则表达式所建议的那样),它将永远不会被匹配。
这两个规则混淆了:
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 的开头或结尾不需要反斜杠转义连字符。)
但是,(现在)第二条规则中的正则表达式可能不明确,因为连字符 (-
) 用于分隔两个值(city
和 speciality
),但是连字符也包含在字符 classes 中,因此它可能是值本身的一部分。但是,city
和 speciality
都不能同时包含连字符,尽管正则表达式似乎允许这样做。
例如,health-institute-foo-bar-baz-qux
的请求应该如何解决?由于量词 +
是 greedy,目前这将导致 search.php?city=foo-bar-baz&speciality=qux
。如果 speciality
中有连字符(正如正则表达式所建议的那样),它将永远不会被匹配。