有两个重写cond用于删除.php和谷歌友好URL

时间:2014-08-06 18:25:52

标签: apache .htaccess mod-rewrite

我想从我的所有网页中移除.php 在我的博客页面中也有一个Google友好网址。例如http:// example.com/about.php必须是http:// example.com/about,http:// example.com/blog.php?id=1&title=2必须是http:// example.com/blog/1/2

我使用 .htaccess 并按照以下方式进行编辑:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
RewriteRule ^blog/([^/]*)/([^/]*)$ /blog.php?id=$1&title=$2 [L]

但是当我浏览时,我只是面对HTTP 500,内部服务器错误。 我怎么了?!

1 个答案:

答案 0 :(得分:0)

这里的问题是,当您将%{REQUEST_FILENAME}变量与-f一起使用时,apache将尝试“模糊猜测”所请求的文件名。在您的情况下,您有一个名为/blog.php的php文件。当您请求/blog/1/2时,%{REQUEST_FILENAME}.php-f将通过路径查找有效的现有文件,因此:

  • /blog/1/2.php =不存在,-f失败
  • /blog/1.php/2 =不存在,-f失败
  • /blog.php/1/2 =作为PATHINFO存在,-f success

但是...

您将.php 附加到URI 的末尾,从而生成如下所示的URI:

/blog/1/2.php

现在,规则循环,同样的事情发生了:

  • /blog/1/2.php.php =不存在,-f失败
  • /blog/1.php/2.php =不存在,-f失败
  • /blog.php/1/2.php =作为PATHINFO存在,-f success

然后再次追加.php

/blog/1/2.php.php

直到达到内部重定向限制,服务器返回500错误。

要解决此问题,请交换规则的顺序:

RewriteEngine on
RewriteRule ^blog/([^/]*)/([^/]*)$ /blog.php?id=$1&title=$2 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

或添加更具体的-f支票:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}\.php -f
RewriteRule ^(.*)$ $1.php
RewriteRule ^blog/([^/]*)/([^/]*)$ /blog.php?id=$1&title=$2 [L]