首页 > 解决方案 > htaccess - 重定向到错误页面问题(带斜线或不带斜线)

问题描述

重定向到错误页面存在问题: example.com/test- 将重定向到 404 错误页面

但是 example.com/test/- 会转到白色的“找不到文件”。页

提一下:

.htaccess 文件代码

<Files .htaccess>
order allow,deny
deny from all
</Files>

RewriteEngine On
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteRule sample/(.*)/(.*)/$ /sample.php?$1=$2

ErrorDocument 400 /400.php
ErrorDocument 401 /401.php
ErrorDocument 403 /403.php
ErrorDocument 404 /404.php
ErrorDocument 410 /410.php

标签: php.htaccessredirecthttp-status-code-404

解决方案


以斜杠结尾的 URL 的不同之处在于它们被无条件地重写到相应的.php文件中。不以斜杠结尾的 URL 不会被重写 - 没有任何反应。

当您直接请求不存在的文件时,您会看到相同的基本“找不到文件”响应.php,无论请求是否被重写(根据您的规则)。

“问题”可能是由于 PHP 在您的服务器上实现的方式造成的。例如,如果所有*.php请求都被代理到另一个后端进程,那么这将绕过您.htaccess在应用程序服务器上的文件,并且您看到的“基本”404 响应可能来自代理,而不是您的应用程序服务器。

您可以通过.php在重写之前首先检查它是否存在来解决此问题(因此它不会触发 404)。如果您的URL都不包含.php扩展名,您还可以强制对文件的任何直接请求为.php404(在您的服务器上,在请求被代理之前 - 如果发生这种情况)。

RewriteEngine On
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteRule sample/(.*)/(.*)/$ /sample.php?$1=$2

前两条规则也可以合并为一条。您在所有规则上都缺少L标志。您需要确保禁用 MultiViews,否则最后一条规则将不起作用。

此外,最后一条规则中的正则表达式需要锚定并更具体,因为它匹配太多,例如。/sample/foo/bar/baz/qux将被重写为/sample.php?foo/bar/baz=qux,我认为这不是本意。

请尝试以下操作:

Options -MultiViews

RewriteEngine On

# Force any direct request for ".php" files to 404
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.php$ - [R=404]

# Rewrite to ".php" file - 1 or 2 path segments
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^/]+(/[^/]+)?)/$ $1.php [L]

# Rewrite "/sample/one/two/"
RewriteRule ^sample/([^/]+)/([^/]+)/$ sample.php?$1=$2 [L]

参考:

另一个最近的问题有一个非常相似的问题并以相同的方式解决:
htaccess 中的自定义 404 错误处理程序不适用于不存在的“.php”文件


推荐阅读