微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何检查无效目录并返回 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 举报,一经查实,本站将立刻删除。