我想从我的所有网页中移除.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,内部服务器错误。 我怎么了?!
答案 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]