【问题标题】:Missing trailing slash after tld breaks ssl redirection from external linktld 中断来自外部链接的 ssl 重定向后缺少尾部斜杠
【发布时间】: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 之后插入一个额外的斜杠

【问题讨论】:

    标签: apache .htaccess redirect mod-rewrite ssl


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多