我有一个带有自定义.htaccess文件的网站,该文件可以处理以下几件事:
1)它把没有扩展名“ .php”的URL当作最后一个“ .php”对待。
2)它重定向http://和http://www。网址为https://www。
这是.htaccess文件:
RewriteEngine On
## add www and turn on https in same rule
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L,NE]
# if not a directory and .php file is present then add .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
ErrorDocument 404 /404.php
一切正常,但是我在网站管理员工具中发现了一些奇怪的问题,导致500错误而不是404错误:
当您访问不存在的根级别URL(例如https://www.example.com/skjdfhkj)时,它会按预期重定向到404。
但是,当您访问诸如https://www.example.com/some-page/skjdfhkj之类的嵌套URL时,其中some-page
与现有php文件的名称匹配,那么它将发出500服务器错误。如果some-page
与任何现有的php文件都不匹配,则它将按预期返回404。
此站点中的所有ulul都是根级别,并且任何地方都没有嵌套的文件夹结构。我已经检查了代码,没有指向嵌套URL的链接,所以不确定它们是如何到达网站站长工具的,很可能是网站上某些地方的错误链接不再存在。
我的问题是,当有人访问不存在的嵌套网址(例如https://www.example.com/some-page/skjdfhkj)时,如何更新htaccess以正确返回404?
答案 0 :(得分:1)
此站点中的所有漏洞都是根级别的,并且在任何地方都没有嵌套的文件夹结构。
您可以使用此代码块替换所有.htaccess代码:
ErrorDocument 404 /404.php
Options -MultiViews
RewriteEngine On
## add www and turn on https in same rule
RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L,NE]
# if not a directory and .php file is present then add .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^/.]+)/?$ $1.php [L]