尾部斜杠未添加到我的 .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]
下面的规则正在完成我想要的,即 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]