htaccess 404重定向嵌套目录的自定义规则

时间:2019-05-17 10:25:06

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

我有一个带有自定义.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?

1 个答案:

答案 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]