尾部斜杠未添加到我的 .htaccess 重写中

Trailing Slash Not Being Added to My .htaccess Rewrite

下面的规则正在完成我想要的,即 www 到非 www 和 http 到 https,但是,我还有两个问题:

所有页面都应添加尾部斜杠(以任何类型的修饰符结尾的页面除外,例如 /page#foo、page/foo.jpg 等

这是我的 .htaccess 文件中的当前规则

RewriteEngine On
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/ [R=301,L]

The rules below are accomplishing what I want, i.e., www to non-www and http to https

您发布的规则没有专门将 HTTP 重定向到 HTTPS,因为它不会重定向 http://example.com/ (HTTP + non-www) 请求。如果您看到这个重定向,那么 其他东西 正在这样做。

RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/ [R=301,L]

顺便说一句,第一个 condition 检查 Host header 不是 localhost 是完全多余的,因为如果第二个 条件为真。这两个条件是相互包容的。

Trailing slash should be added to all pages (except pages that end with any type of modifier, e.g., /page#foo, page/foo.jpg, etc.)

无法检测 片段标识符 (又名 哈希 )(即 /page#foo 中的 foo ) 在 .htaccess 中,因为 URL 的这一部分(即 #foo)不会作为 HTTP 请求的一部分发送到服务器。 URL 的 #foo 部分仅被 client-side code/JavaScript 使用。对于服务器而言,/page#foo/page没有区别。如果这对您来说是个问题,那么您不能在 .htaccess 中强制使用尾部斜杠。但是,尾部斜杠将添加在 /page 之后而不是 /page#foo 之后(如果那是您的想法),即。 /page#foo 会被重定向到 /page/#foo,所以这应该不是问题。

您可以在现有规则 之前 添加以下规则,就在 RewriteEngine 指令之后:

# Append trailing slash to URL-path if omitted unless it looks like an actual file
RewriteCond  !\.\w{2,4}$
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^(.*[^/])$ https://%1// [R=301,L]

RewriteRule 模式 ^(.*[^/])$ 匹配任何尚未以斜杠结尾的 URL-path。 URL-path 然后在 </code> 反向引用中被捕获。第一个 <em>condition</em>(<code>RewriteCond 指令)然后检查 URL-path 不以 looks-like 文件扩展名结尾(即一个点后跟2 到 4 个字母数字 upper/lowercase 个字符之间)。第二个 条件 然后只捕获域名减去任何可选的 www. 前缀,将其保存在 %1 反向引用中。

这也会重定向到 HTTPS 和 non-www 域名,因此它避免了可能的第二次重定向,即遵循的规则。

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

如果您在本地主机上进行测试,而本地主机不支持 HTTPS,则修改规则如下,以便仅在本地主机上保留 HTTP。例如:

RewriteCond  !\.\w{2,4}$
RewriteCond %{HTTP_HOST} ^()(localhost)$ [OR]
RewriteCond s%{HTTP_HOST} ^(s)(?:www\.)?(.+?)\.?$ [NC]
RewriteRule ^(.*[^/])$ http%1://%2// [R=301,L]