【问题标题】:Apache Rewrite with variables in Query StringApache用查询字符串中的变量重写
【发布时间】:2013-12-04 16:27:21
【问题描述】:

我有一个两部分的问题,我只在第一部分成功。 我在 .htaccess 中列出了以下内容,效果很好:

RewriteRule ^senior/?$  demo.php?dID=1 [NC,L] 

因此,访问者可以直接访问 mysite.com/senior,然后会调出正确的内部页面 (demo.php?dID=1)。

我的问题是我还想重写 /demo.php?dID=1 在 URL 栏中显示为 /senior。因此,现有链接会以新的用户友好 url 显示。

到目前为止,我的尝试是:

RewriteCond %{QUERY_STRING}           ^dID=1$
RewriteRule ^demo.php$   senior [NC] 
RewriteRule ^senior/?$  demo.php?dID=1 [NC,L] 

感谢您的时间和帮助。

【问题讨论】:

    标签: .htaccess mod-rewrite url-rewriting


    【解决方案1】:

    您想匹配请求而不是查询字符串并重定向浏览器:

    RewriteCond %{THE_REQUEST}  \ /demo\.php\?dID=1($|\ |&)
    RewriteRule ^demo.php$   /senior? [NC,R] 
    RewriteRule ^senior/?$  /demo.php?dID=1 [NC,L] 
    

    【讨论】:

    • 其实上面有个小错误。如果传递的 ID 是 1 或 11,则匹配 1,而不是 11。如果 id 是 8 或 86,则匹配 8。
    • @Ryan 查看条件的附加正则表达式元素
    【解决方案2】:

    将此附加规则放在当前规则之前:

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+demo\.php\?dID=([^\s&]+) [NC]
    RewriteRule ^ /senior? [R=302,L]
    
    RewriteRule ^senior/?$ /demo.php?dID=1 [NC,L] 
    

    您当前基于 QUERY_STRING 的规则将循环,因为内部重写规则将填充 QUERY_STRING 并且两个规则将继续相互触发。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-13
    • 2016-08-13
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多