Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess 将尾部斜杠添加到URL时获得301而不是404_.htaccess_Mod Rewrite_Http Status Code 404_Trailing Slash - Fatal编程技术网

.htaccess 将尾部斜杠添加到URL时获得301而不是404

.htaccess 将尾部斜杠添加到URL时获得301而不是404,.htaccess,mod-rewrite,http-status-code-404,trailing-slash,.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://

我在这里工作了几个小时,找不到关于它的信息。是的,有一些信息,但我只能找到单独的解决方案,这些解决方案不能放在一起使用

我试着从这个开始:

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


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

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

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

我终于找到了解决办法!!!这并不简单,我也不太明白它是如何工作的。我试过亚当·迪梅奇的密码,可以在中找到

代码是:

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扩展并强制使用尾部斜杠。希望对更多的人有用

谢谢Jon Lin,但它一直在添加斜杠,所以我在第二个请求中得到了第一个301和404。