.htaccess区分大小写和文件扩展名



我想做两件事与我的。htaccess文件在https://example.com

  1. 我希望所有文件路径不区分大小写。目前我所有的文件和文件夹都以大写字母开头。

  2. 我希望所有文件都能被查看和访问,而不需要在末尾添加文件扩展名。

我当前的。htaccess文件:

ErrorDocument 401 https://www.example.com
ErrorDocument 403 https://www.example.com
ErrorDocument 404 https://www.example.com
ErrorDocument 500 https://www.example.com
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]
Header always set Content-Security-Policy "upgrade-insecure-requests;"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=302,L]
RewriteCond %{HTTP_HOST} ^example.com.subdomains.example.com$
RewriteRule ^/?$ "https://example.com/" [R=301,L]
  1. 我希望所有文件路径不区分大小写。目前我所有的文件和文件夹都以大写字母开头。

由于底层文件系统路径是混合的,您将需要使用mod_spellling(一个l)。(您需要访问服务器配置以确保启用该模块。)

那么您可以在.htaccess中使用以下命令:

# Allow mixed case requests (mod_speling)
CheckSpelling on
CheckCaseOnly on
但是,请注意,这会触发外部重定向到正确大小写的URL。因此,如果用户请求/foo/bar/baz,他们将从外部重定向到/Foo/Bar/Baz

但是,如果生成500 Internal Server Error,则可能没有安装mod_spelling。

  1. 我希望所有文件都能够被查看和访问,而不需要在末尾添加文件扩展名。

我假设你指的只是主要的.html(或.php)文件,是你的页面请求的一部分,而不是字面上的所有文件,如在所有静态资源,例如。image/image.jpg,mystyles/mystyles.css

您需要在HTTP到HTTPS重定向之后立即添加以下内容,并在重定向之前添加,将不存在的请求发送到外部服务器。

# Rewrite request to append file extension. eg. "/foo" to "/foo.html"
RewriteCond %{REQUEST_URI} !(.w{2,4}|/)$
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule (.+) $1.html [L]

第一个条件避免检查请求是否已经以文件扩展名(或斜杠-表示目录)结束。这样做的副作用是,在最后的路径段中不能有看起来像的点。文件扩展名(通常可以避免的边缘情况)。如。/example.foo不会被重写为/example.foo.html(如果该文件应该存在)。但/foo.example可能会被改写。这是一个优化,以避免大量不必要的文件系统检查。

第二个条件在重写请求之前检查相应的.html是否存在。

您需要确保始终链接到没有文件扩展名的URL,以避免潜在的重复内容问题(并将文件扩展名暴露给用户)。

如果你正在改变一个现有的URL结构,那么你可以实现一个外部重定向,从URL直接请求删除.html文件扩展名。这将是必要的,以保持SEO和任何反向链接。但是,这不能代替更改HTML源中的内部链接以删除.html扩展名。

如果需要,则在上面的"rewrite"之前添加以下内容:

# Redirect - remove the ".html" extension, eg. "/foo.html" to "/foo"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+).html$ /$1 [R=301,L]

注意:先测试302(临时)重定向,以避免潜在的缓存问题。


UPDATE # 1:

它正在使用LiteSpeed服务器

不幸的是,LiteSpeed目前不支持mod_spelling -这是一个仅限apache的模块。

,(不幸的是)……LiteSpeed不会"中断";当它在.htaccess文件中读取错误时-它只是忽略它(静默)。这使得调试这些东西更加困难。

如果没有大量的工作,你将无法在LiteSpeed上使url不区分大小写(阅读:这是不值得的)。只要确保你在整个网站中使用正确的大小写url(或者将所有内容都转换为小写)。


更新# 2:

我希望所有的文件,包括图像和其他静态文件的工作。

除非你有很好的理由这样做,否则我建议不要这样做。同样,LiteSpeed不支持MultiViews/mod_negotiation——这将是"最简单的"方式。如何在Apache上做到这一点。(但是,MultiViews可能与您稍后可能添加的重写发生冲突,并导致其他问题,除非您对此有经验。)

在LiteSpeed上这样做将是一个相当繁琐(和资源密集)的过程,手动检查每个文件扩展名,看看它是否存在。

还可能出现mime类型问题,因为浏览器无法从文件扩展名中推断出任何内容。下载任何文件的用户都必须手动为其添加适当的文件扩展名以"工作"。本地。

这也为您打开了许多"重复"的"问题,除非你实现重定向剥离文件扩展名。

相关内容

  • 没有找到相关文章

最新更新