tld 中断来自外部链接的 ssl 重定向后缺少尾部斜杠
Posted
技术标签:
【中文标题】tld 中断来自外部链接的 ssl 重定向后缺少尾部斜杠【英文标题】:Missing trailing slash after tld breaks ssl redirection from external link 【发布时间】:2016-11-21 16:15:54 【问题描述】:我已将我的网站更改为 ssl。它工作正常,网站内部的所有链接都可以工作,但指向 http 版本的外部链接已损坏,因为域名末尾的斜杠丢失了,例如
astarmathsandphysics dot com/a-level-physics-notes/thermal-physics-and-gases/a-level-physics-notes-prevosts-theory-of-heat-exchange.html
.com 重定向后缺少斜杠
我需要强制使用斜杠。在 apache2 配置文件中,我已重定向到带有斜杠的 ssl 版本,并将此代码插入到我的 .htaccess 文件中
Options +FollowSymlinks
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
RewriteEngine On
RewriteCond %HTTP_HOST ^www\.(.*)
RewriteRule ^.*$ https://%1/$1/ [R=301,L]
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
同样从非 ssl www 重定向到 ssl 非 www 会在 .com 之后插入一个额外的斜杠
【问题讨论】:
【参考方案1】:如果我理解正确的话,你想做三件事:
如果 URL 不是目录,则删除尾部斜杠 将 www URL 重定向到非 www 将 http URL 重定向到 https至少,这就是您的 .htaccess 告诉我的。现在解决问题。
对于第一条规则,(.*)
匹配整个请求 URI 减去尾部斜杠(如果存在)。这意味着您只需要在第二部分使用$1
,而不是/$1
,它会产生双斜杠。这将被重写为:
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ $1 [R=301,L]
现在是第二条规则。您在这里基本上有相同的双斜杠问题,因为$1
捕获了完整的请求 URI,包括开头的斜杠。重写它看起来像:
RewriteCond %HTTP_HOST ^www\.(.*)$
RewriteRule ^(.*)$ https://%1$1 [R=301,L]
由于该规则只是复制整个请求 URI,因此以下规则将是等效的:
RewriteCond %HTTP_HOST ^www\.(.*)$
RewriteRule ^ https://%1%(REQUEST_URI [R=301,L]
最后的规则很好,除了如果你希望它是永久的,你应该使用R=301
而不是隐式的 302 重定向。此外,作为最佳实践,您不应忽略 ^
和 $
。改写为:
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [R=301,L]
进一步注意,您只需要在文件中使用一次RewriteEngine on
。
所以所有的规则看起来像这样:
RewriteEngine on
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(.*)/$ $1 [R=301,L]
RewriteCond %HTTP_HOST ^www\.(.*)$
RewriteRule ^ https://%1%(REQUEST_URI [R=301,L]
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [R=301,L]
【讨论】:
以上是关于tld 中断来自外部链接的 ssl 重定向后缺少尾部斜杠的主要内容,如果未能解决你的问题,请参考以下文章
如何将所有请求重定向到 https)://www.domain name.tld/