如何检查无效目录并返回 404?

问题描述

我正在尝试将一个 .htaccess 文件放在 httpdocs 目录中,我希望在许多具有类似结构的站点中使用该文件,并最终在许多情况下获得干净的 URL。

我最近发现了一篇很棒的帖子 (Removing file extions(.html & .php) And Trailing Slash in Website URL),它几乎完全符合我的要求,但我的重写经验非常有限,我真的很难找到最后一块拼图。>

我有许多条件要通过才能使其完全工作;

带有 html 扩展的页面

example.com/valid_page.html 呈现 example.com/valid_page [pass]

没有 html 扩展的页面

example.com/valid_page 呈现 example.com/valid_page.html [pass]

example.com/valid_page/ 删除斜线并呈现 example.com/valid_page.html [pass]

页面同名的目录:

example.com/valid_page_same_as_dir/valid_page 呈现 example.com/valid_dir_same_as_page/valid_page.html [pass]

example.com/valid_page_same_as_dir 呈现 example.com/valid_page_same_as_dir.html [pass]

不存在的页面和目录:

example.com/something_invalid 在显式网址 [pass] 处显示 404 错误文档

example.com/valid_dir/something_invalid 在显式网址 [pass] 处显示 404 错误文档

example.com/valid_page/something_invalid 在显式 url 处显示 404 错误文档 [失败 - 实际上显示 500 内部服务器错误]

如您所见,最后一个是问题所在。如果页面名称存在而具有相同名称的目录不存在,那么我们会遇到内部服务器错误,而不是抛出 404。

我已经尝试使用我能够找到的资源对其进行大量调整以使其正常工作,但我无法满足最后一个条件。 .htaccess 文件的当前内容如下。

DirectorySlash Off
RewriteEngine On

# If it's a request to index(.html) 
RewriteCond %{THE_REQUEST} \ /(.+/)?index(\.html)?(\?.*)?\  [NC]
# Remove it. 
RewriteRule ^(.+/)?index(\.html)?$ /%1 [R=301,L]

# if request has a trailing slash
RewriteCond %{REQUEST_URI} ^/(.*)/$
# but it isn't a directory
RewriteCond %{DOCUMENT_ROOT}/%1 !-d
# and if the trailing slash is removed and a .html appended to the end,it IS a file
RewriteCond %{DOCUMENT_ROOT}/%1.html -f
# redirect without trailing slash
RewriteRule ^ /%1 [L,R=301]

RewriteCond %{REQUEST_FILENAME} -d
# And a HTML file exists.
RewriteCond %{REQUEST_FILENAME}/index.html -f
# And there is a trailing slash redirect to remove it. 
RewriteRule ^(.*?)/$ /$1 [R=301,L] 

RewriteCond %{REQUEST_FILENAME} -d
# And a HTML file exists.
RewriteCond %{REQUEST_FILENAME}/index.html -f
# And there is no trailing slash show the index.html. 
RewriteRule [^/]$ %{REQUEST_URI}/index.html [L]   

# Remove HTML extensions. 
# If it's a request from a browser,not an internal request by Apache/mod_rewrite. 
RewriteCond %{ENV:REDIRECT_STATUS} ^$
# And the request has a HTML extension. Redirect to remove it. 
RewriteRule ^(.+)\.html$ /$1 [R=301,L]

# If the request exists with a .html extension. 
RewriteCond %{SCRIPT_FILENAME}.html -f
# And there is no trailing slash,rewrite to add the .html extension. 
RewriteRule [^/]$ %{REQUEST_URI}.html [QSA,L]

ErrorDocument 404 https://example.com/404

如果有人对我们如何克服这个问题有任何想法,我非常感谢您的想法。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)