我遇到了 HTTP 重定向问题:
我开始说我的主页完美地将 HTTP 重定向到 HTTPS。我的所有页面也都显示 HTTPS,但是一旦我将 URL 设置为 HTTP,或者只设置 HTTP,www.example.co.uk/page1
它就会转到 HTTP。
例如:
https://example.co.uk/about-us/
http://example.co.uk/about-us/
我的.htaccess
文件中已经有此代码:
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} (www\.)?example.co.uk
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
我已将其更改为代码,我看到有人提到可以解决该问题:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
但它仍然不起作用,两者都有同样的问题。
编辑#1:我在提到的代码上面还有另一个代码,它一直都在那里:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteCond %{HTTPS} off
</IfModule>
编辑#2:我的完整.htaccess
文件:
答案1
我上面提到的代码上面还有另一个代码
您把代码放错了位置。您的 HTTP 到 HTTPS 重定向需要取消前现有代码位于文件的最顶部.htaccess
。
通过将重定向放置在上述代码之后,除了主页(根目录)或现有文件/目录之外,其他任何内容都不会得到处理。因此,您只能看到主页的重定向。
您不需要重复该RewriteEngine
指令。
RewriteCond
最后还有一个多余的指令,应该将其删除。
换句话说,你.htaccess
应该看起来像这样:
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Front-controller
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
但是,除非这是 WordPress 并且您还有# BEGIN WordPress
/# END WordPress
注释标记,否则<IfModule>
包装器是不必要的,并且如果像这样重写会更具可读性:
RewriteEngine On
RewriteBase /
# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Front-controller
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
请注意,我删除了最后一个斜线前缀RewriteRule
代换字符串。(这就是该RewriteBase
指令的用途。尽管RewriteBase
这里该指令并非绝对必要。)