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

.htaccess Case-Sensitivity and File Extensions

我想在 https://example.com

上用我的 .htaccess 文件做两件事
  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. I want all file paths to not be case sensitive. Currently all of my files and folder start with a capital letter.

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

然后你可以在.htaccess中使用以下内容:

# Allow mixed case requests (mod_speling)
CheckSpelling on
CheckCaseOnly on

但是请注意,这会触发外部重定向到正确大小写的 URL。因此,如果用户请求 /foo/bar/baz,他们将被外部重定向到 /Foo/Bar/Baz.

但是,如果这会生成 500 内部服务器错误,则可能未安装 mod_speling。

  1. I want all files to be able to be viewed and accessed without adding the file extension to the end.

我假设您指的只是页面请求中的主要 .html(或 .php)文件,而不是字面上的 all 文件,就像在所有静态资源中一样,例如。 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}/.html -f
RewriteRule (.+) .html [L]

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

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

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

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

如果需要,则在上面的“重写”之前添加以下内容:

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

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


更新#1:

It's using the LiteSpeed server.

不幸的是,mod_speling is not currently supported on LiteSpeed - 这是一个仅限 Apache 的模块。

并且(不幸的是)... LiteSpeed 在读取 .htaccess 文件中的错误时不会“中断” - 它只是(静默地)忽略它。这使得调试这些东西变得更加困难。

如果不做大量工作,您将无法在 LiteSpeed 上使 URLs 不区分大小写(阅读:这不值得)。只需确保在整个站点中使用大小写正确的 URLs(或将所有内容都转换为小写)。


更新#2:

I'm wanting that to work for all files including images and other static files.

除非你有充分的理由这样做,否则我不建议这样做。同样,LiteSpeed 不支持 MultiViews/mod_negotiation - 这将是在 Apache 上执行此操作的“简单”方法。 (但是,MultiViews 可能会与您稍后可能添加的重写发生冲突,并导致其他问题,除非您对此有经验。)

要在 LiteSpeed 上执行此操作将是一个相当乏味(并且资源密集型)的过程,需要手动检查每个文件扩展名以查看它是否存在。

您还可能遇到 MIME 类型问题,因为浏览器无法从文件扩展名推断出任何内容。下载任何内容的用户必须手动添加适当的文件扩展名才能在本地“工作”。

除非您实施重定向以去除文件扩展名,否则这也会让您面临许多“重复”问题。