我已将网站更改为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
之后插入一个额外的斜杠答案 0 :(得分:1)
如果我理解正确,你想做三件事:
至少,这就是你的.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]