【问题标题】:confusion between two rewrite urls rules两个重写网址规则之间的混淆
【发布时间】:2022-01-01 20:54:25
【问题描述】:

这两个规则被混淆了:

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

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

我怎么能说这是两条独立的规则?

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

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

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

    例如:

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

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

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

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

    【讨论】:

    • @narseoh 实际上,由于这些值由连字符分隔,因此通过在字符类中包含连字符(即值本身可以包含连字符),您正在引入歧义。例如。 health-institute-foo-bar-baz-qux 应该解决什么问题? city 可以包含连字符吗?
    • 是的,有些城市的城市名称有连字符,而其他城市有两个单词,空格被url中的连字符替换
    • @narseoh 好的,所以speciality 从不包含连字符? (否则,它将成为city 的一部分。)在这种情况下,应从speciality 字符类中删除连字符,以消除这种歧义/混乱,因为它是多余的。
    • 感谢@MrWhite,实际上即使是专业也可以有一个连字符,这让我的事情变得更复杂一些。我考虑了一下并用(/)替换了(-)以分隔数据,这表示我有其他问题(我将为此创建另一个线程)
    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多