【问题标题】:How to use Apache Mod_rewrite to remove php extension, while preserving the GET parameters?如何使用 Apache Mod_rewrite 删除 php 扩展,同时保留 GET 参数?
【发布时间】:2012-08-27 05:37:03
【问题描述】:

我试图从我的网站中删除 PHP 扩展。当用户请求一个 PHP 文件时,PHP 将被删除并重定向用户,当用户键入一个没有 PHP 的 URL 时,将提供实际的 PHP 文件。这很好用,除非 URL 中有 GET 参数。我的规则如下:

# remove .php ONLY if requested directly
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1)
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]

# remove trailing slash ONLY if it is not an existing folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# rewrite to FILENAME.php if such file does exist and is not a folder
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /$1.php [L,QSA]

我认为即使有任何 GET 参数,这也应该已经能够删除 php,但它失败了。我也尝试过这样的事情:

RewriteCond %{THE_REQUEST} (\.php\sHTTP/1)
RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA]

它也没有工作,php 仍然存在。但如果我尝试:

RewriteRule ^(.)\.php(.)$ $1$2 [R=301,L,QSA]

即,移除 RewriteCond,php 扩展被移除,参数被保留,但页面不会被提供,因为浏览器说重定向太多。

请问大家有什么想法吗?

【问题讨论】:

    标签: php apache mod-rewrite parameters


    【解决方案1】:

    感谢 SteAp 的回答。刚才正好想出了一个处理办法,在这里分享一下,以防其他人遇到类似的问题。

    在我的规则中,我有

    # remove .php ONLY if requested directly
    RewriteCond %{THE_REQUEST} (\.php\sHTTP/1)
    RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
    

    当用户请求一个 PHP 文件时执行外部重定向。这里的 RewriteCond 是为了防止重定向循环 - 即由于不正确的内部重写和外部重定向导致的无限重定向(删除 php,然后添加 php,然后再次删除,...)

    当有参数时,实际头部为http://domain.com/file.php?.... HTTP/1.1 像这样的东西,所以 RewriteCond 中的模式将不起作用,因为它没有考虑参数。

    要解决它,只需将上面的代码替换为:

    # remove .php ONLY if requested directly
    RewriteCond %{THE_REQUEST} (\.php(.*)\sHTTP/1)
    RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]
    

    这样就可以通过模式匹配参数,现在一切正常。

    希望这能帮助遇到类似问题的人(或者只是像我这样的菜鸟?哈哈)

    【讨论】:

    • in RewriteRule: /$1 生成损坏的 url,使用 $1 没有 /
    【解决方案2】:

    您可能希望使用记录在here 中的%{QUERY_STRING} 参数。

    有用的阅读herehere

    【讨论】:

      猜你喜欢
      • 2013-04-20
      • 2013-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-12
      • 2015-06-29
      • 2013-10-11
      • 1970-01-01
      相关资源
      最近更新 更多