在向URL添加尾部斜杠时获取301而不是404

时间:2012-12-28 02:53:20

标签: .htaccess mod-rewrite http-status-code-404 trailing-slash

我已经在这里工作了几个小时,无法找到有关它的信息。是的,有信息,但我只能找到不起作用的单独解决方案。

我试图从这开始:

RewriteCond %{REQUEST_URI} \.(php)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]

代码有效,我得到尾随斜杠。但是,如果我放置一个不存在的文件名,则返回301.例如:

http://www.example.com/thisfiledoesnotexist.php

第一个标头响应是301,它是合乎逻辑的,因为它试图返回:

http://www.example.com/thisfiledoesnotexist.php/

然后它返回404,但这样就需要两个请求才能返回404。

我说很多人以前发现过这个问题,我认为这是一个常见的问题,但我还没有找到解决方案。

2 个答案:

答案 0 :(得分:2)

尝试使用-f检查。它检查请求是否适用于现有文件:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.(php)$
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteRule ^(.*)$ http://www.example.com/$1/ [L,R=301]

答案 1 :(得分:1)

最后我得到了解决方案!这并不简单,我真的不明白它是如何工作的。我尝试了Adam Dimech的代码,可以在this page中找到。

代码是:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php

RewriteCond %{THE_REQUEST} ^[A-Z]+\ /([^/]+/)*[^.]+\.php(\?[^\ ]*)?\ HTTP/
RewriteRule ^(([^/]+/)*[^.]+)\.php$ http://www.example.com/yourdirectory/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ http://www.example.com/yourdirectory/$1/ [R=301,L]

此代码必须放在我们将要使用的每个目录中。如果您使用相对路径,则必须使用

代码非常棒。现在我可以取消php扩展并强制使用尾随斜杠。希望它对更多人有用!