【问题标题】:Getting 301 instead of 404 when adding trailing slash to URL向 URL 添加斜杠时获取 301 而不是 404
【发布时间】:2012-12-13 09:27:29
【问题描述】:

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

我试图从这个开始:

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。

我想很多人以前都发现过这个问题,我相信这是一个普遍的问题,但我还没有找到解决办法。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Jon Lin,但它一直在添加斜线,所以我在第二个请求中首先得到 301 和 404。
    【解决方案2】:

    终于解决了!!!这并不简单,我真的不明白它是如何工作的。我尝试了 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 扩展名并强制使用斜杠。希望对更多人有用!

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多