在tld从外部链接中断ssl重定向后丢失尾随斜杠

时间:2016-07-18 22:55:17

标签: apache .htaccess redirect mod-rewrite ssl

我已将网站更改为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 non www在.com

之后插入一个额外的斜杠

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你想做三件事:

  • 如果URL不是目录,则删除尾部斜杠
  • 将www网址重定向到非www
  • 将http网址重定向到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]