【问题标题】:Url rewriting mod_rewrite with and without query string使用和不使用查询字符串的 URL 重写 mod_rewrite
【发布时间】:2012-09-23 20:16:29
【问题描述】:

我正在尝试使用以下代码从 domain.com/page/soft-15/android-26/ 重写为 page.php?cat=15&os=26:

RewriteRule ^page/([0-9]+)\-([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)$ page.php?cat=$1&os=$2

我认为它工作正常,但是,我怎样才能将 domain.com/page/ 和 domain.com/page(没有最后一个正斜杠)重写为 domain.com/page.php 以保持这两个规则正常工作?

【问题讨论】:

    标签: apache .htaccess mod-rewrite url-rewriting friendly-url


    【解决方案1】:

    好吧,我认为我把 Jimp 和 Jon 代码混合在一起

    RewriteRule ^page/?$ page.php [L]
    RewriteRule ^page/(?:[a-zA-Z0-9-]*-)?([0-9]+)/(?:[a-zA-Z0-9-]*-)?([0-9]+)/?$ page.php?cat=$1&os=$2 [L]
    RewriteRule ^page/(?:[a-zA-Z0-9-]*-)?([0-9]+)/?$ page.php?cat=$1 [L]
    

    这个数学与

    domain.com/page
    domain.com/page/
    domain.com/page/soft-15
    domain.com/page/soft-15/
    domain.com/page/15
    domain.com/page/15/
    domain.com/page/soft-15/android-26
    domain.com/page/soft-15/android-26/
    domain.com/page/soft-15/26
    domain.com/page/15/26
    and so on...
    

    【讨论】:

      【解决方案2】:

      在您的模式中添加一个尾随 /?(在 $ 锚点之前)。 ? 使 / 可选。

      此外,您的模式似乎落后,匹配字符前的数字。试试这个:

      RewriteRule ^page/(?:([a-zA-Z\d-]*)-)?(\d+)/(?:([a-zA-Z\d-]*)-)?(\d+)/?$ page.php?cat=$1&os=$2
      

      这应该与这些变体相匹配:

      domain.com/page/soft-15/android-26
      domain.com/page/soft-15/android-26/
      domain.com/page/15/android-26
      domain.com/page/15/android-26/
      domain.com/page/soft-15/26
      domain.com/page/soft-15/26/
      domain.com/page/15/26
      domain.com/page/15/26/
      

      【讨论】:

      • 我的代码(有或没有你的尾随)试图输入 domain.com/page/ (或 domain.com/page )只是打印请求的 URL 在此服务器上找不到
      • 我之前没有仔细查看您的模式,因为您说它工作正常,但我认为这是不可能的。你的 [匹配字符]-[匹配数字] 模式被交换了。我会再试一次。
      • 正如#Jon Lin 所说,我/你的代码重写为 page.php?cat=soft&os=15
      • 是的,我终于得到了我想要的,代码就在我自己的问题下面
      【解决方案3】:

      您的反向引用似乎与您使用的示例不符:

      • /page/soft-15/android-26/
      • page.php?cat=15&os=26

      您的正则表达式看起来很匹配:

      • /page/15-soft/26-android/

      并重写为:

      • page.php?cat=15&os=soft

      如果你按照你的例子,你会想要这样的:

      RewriteRule ^page/[a-zA-Z0-9-]*?-([0-9]+)/[a-zA-Z0-9-]*?-([0-9]+)/?$ page.php?cat=$1&os=$2
      RewriteRule ^page/[a-zA-Z0-9-]*?-([0-9]+)/?$ page.php?cat=$1
      RewriteRule ^page/?$ page.php
      

      【讨论】:

      • 你是对的,我的代码有误,你的代码工作正常,但无论如何我想要的是在所有条件下工作,有 2 个查询,page/soft-15 /android-26,有 1 个查询,page/soft-15 或根本没有查询字符串,page/
      • @Colas 那么你需要为每个规则制定一个规则。查看编辑后的答案
      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      相关资源
      最近更新 更多