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/

htaccess重定向TLD

Xampp - 将外部 url 重定向到 localhost

使用特定的 TLD XAMPP 虚拟主机重定向所有内容

使用特定的 TLD XAMPP 虚拟主机重定向所有内容