【问题标题】:Rewrite URL term(s) separated by equal sign to query string(s)将用等号分隔的 URL 术语重写为查询字符串
【发布时间】:2011-08-21 01:10:29
【问题描述】:

使用 mod_rewrite,什么 RewriteRule(s) 可以使以下两个示例正常运行?

示例 #1 (一个术语):

http://example.net/dir/thanks
-to-
http://example.net/dir/index.php?a=thanks

示例 #2 (两个术语):

http://example.net/dir/thanks=stackoverflow
-to-
http://example.net/dir/index.php?a=thanks&b=stackoverflow

注意:.htaccess 文件位于域根目录之外的 /dir/ 中。

我已经接近了:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)=([^/]*)/?$ index.php?a=$1&b=$2 [L]

但是,要使用示例 #1,需要尾随“=”(我想避免)。我尝试将“=”更改为“=?”在正则表达式中使其成为可选,但是当它在例如 #1 时它会失败,例如 #2。

非常感谢您考虑我的问题。我是 mod_rewrite 和 regex 的新手,真的很难过。

【问题讨论】:

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


    【解决方案1】:

    我看到两种主要方法:

    1. 更安全/更易于理解和必要时扩展。 制定两条规则:第一条将捕获 thanks=stackoverflow,而第二条仅适用于 thanks:

    RewriteEngine On
    
    # do not do anything for already existing files
    RewriteCond %{REQUEST_FILENAME} -f [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule .+ - [L]
    
    # will work with /thanks=stackoverflow
    RewriteRule ^([^/=]+)=([^/=]+)/?$ index.php?a=$1&b=$2 [L]
    # will work with /thanks
    RewriteRule ^([^/=]+)/?$ index.php?a=$1 [L]
    

    2。 将这两条规则合并为一条规则。在这种情况下,参数b= 将始终存在,但对于thanks 场景将为空:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^/=]+)(=([^/=]+))?/?$ index.php?a=$1&b=$3 [L]
    

    两者都测试过——在我的 Apache 机器上运行良好。

    【讨论】:

    • 谢谢!您的两个示例在这里也都很好用。我非常感谢详细的解决方案;他们帮助提高了我对 mod_rewrite 的理解。经过数小时的努力解决我的问题后,由于您的回答,我现在知道哪里出了问题。
    【解决方案2】:

    为什么不创建两个单独的重写规则:

    i) 处理示例 1 - 添加检查它不包含等号 [这样您就不会将示例 2 与重写规则 1 匹配]

    ii) 另一个处理示例 2

    【讨论】:

    • 感谢您对解决方案的有用见解。我已经接受了 LazyOne 的回答,因为它包含工作代码,但您最初帮助我朝着正确的方向前进。
    猜你喜欢
    • 2023-03-04
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 2016-11-17
    • 2021-01-06
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多