php - htaccess - 重定向到错误页面问题(带斜线或不带斜线)
问题描述
重定向到错误页面存在问题:
example.com/test
- 将重定向到 404 错误页面
但是
example.com/test/
- 会转到白色的“找不到文件”。页
提一下:
- 直到前一段时间它才能正常工作(也许是 PHP 版本的更新??)
- 与 www/http/https 版本的链接相同的行为
- 链接的标准结构是
www.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
解决方案
以斜杠结尾的 URL 的不同之处在于它们被无条件地重写到相应的.php
文件中。不以斜杠结尾的 URL 不会被重写 - 没有任何反应。
当您直接请求不存在的文件时,您会看到相同的基本“找不到文件”响应.php
,无论请求是否被重写(根据您的规则)。
“问题”可能是由于 PHP 在您的服务器上实现的方式造成的。例如,如果所有*.php
请求都被代理到另一个后端进程,那么这将绕过您.htaccess
在应用程序服务器上的文件,并且您看到的“基本”404 响应可能来自代理,而不是您的应用程序服务器。
您可以通过.php
在重写之前首先检查它是否存在来解决此问题(因此它不会触发 404)。如果您的URL都不包含.php
扩展名,您还可以强制对文件的任何直接请求为.php
404(在您的服务器上,在请求被代理之前 - 如果发生这种情况)。
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”文件
推荐阅读
- python - 如何更改图例中的行数?
- php - 我想将数组 [1,2,3,4,5,6,7,8,9,10,11] 制作成数组 [1,2,3,4,5,6,7,8,9,1 ,0,1,1] 仅使用此算法
- vim - 长按键'j'后vim光标保持滚动
- android - 科尔多瓦插件火力库编译问题
- python - 如何在图像上添加文本(Python GUI PyQt5)
- python - Beautiful Soup 中的表结构(新)
- python - 如何在一个类中删除从另一个类创建的对象
- pandas - 如何使用 pandas 的 reindex 方法“ffill”插入数据?
- android - Flutter 布局不一致
- unity3d - (Unity3d)为什么quad上的视频纹理质量低于原始视频?