【问题标题】:htaccess rewrite query string to folder breaking $_GEThtaccess 将查询字符串重写到破坏 $_GET 的文件夹
【发布时间】:2015-11-11 21:46:56
【问题描述】:
RewriteCond %{THE_REQUEST} \ /view\?i=([0-9]+)
RewriteRule ^ /view/%1? [L,R]

RewriteRule ^view/([0-9]+)$ /view?i=$1 [L]

这会将http://domain.com/view?i=40 重写为http://domain.com/view/40

问题是,它似乎打破了$_GET['i'](空)。这个答案来自这里。是什么原因造成的?

注意:我之前有一条重写规则,用于从 URL 中删除 .php

【问题讨论】:

    标签: php regex .htaccess mod-rewrite


    【解决方案1】:

    尝试关闭选项MultiViews

    Options -MultiViews
    RewriteEngine On
    
    RewriteCond %{REQUEST_METHOD} =POST
    RewriteRule ^ - [L]
    
    RewriteCond %{THE_REQUEST} \ /view\?i=([0-9]+)
    RewriteRule ^ /view/%1? [L,R]
    
    RewriteRule ^view/([0-9]+)$ /view?i=$1 [NC,L,QSA]
    
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
    RewriteRule ^ %1 [R,L,NC]
    
    RewriteCond %{REQUEST_FILENAME}.php -f
    RewriteRule ^ %{REQUEST_FILENAME}.php [L]
    

    选项 MultiViews 由运行 before mod_rewriteApache's content negotiation module 使用,并使 Apache 服务器匹配文件的扩展名。所以/file 可以在 URL 中,但它会服务于/file.php

    【讨论】:

    • 我还要提到您添加了QSA 标志(查询字符串追加),它将您提供的查询字符串与原始字符串合并。我觉得这可能是实际的解决方案,而不是 MultiViews。
    • 现在工作!感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多