.htaccess非www到www和http到https重定向

时间:2017-06-16 17:19:51

标签: apache .htaccess redirect mod-rewrite

由于某些原因,我的重定向无效。我只想要非www去www和非https去https。这就是我所拥有的。它来自this post

RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

编辑:这是我的整个文件。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteCond %{HTTPS} Off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTP_HOST} blog.example.com
RewriteRule ^(.*)$ https://www.example.com/blog/$1 [R=permanent,L]

RewriteCond %{HTTP_HOST} ^example.com/blog/$ [NC]
RewriteRule (.*) https://www.exmaple.com/blog/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^www.example.com/blog/$ [NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule (.*) https://www.example.com/blog/$1 [R=301,L]

RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

1 个答案:

答案 0 :(得分:2)

  

我只想要非www去www和非https去https。

您最初的结果很接近,但这取决于SSL证书的管理方式。如果SSL由前端代理管理(例如,Cloudflare flexible-SSL / FREE选项),那么它可能没问题。但是,如果SSL证书直接安装在您的服务器上,则可能不会。

尝试类似:

# Non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

# Non-SSL to SSL
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

这假设您只有example.comwww.example.com,并且没有其他子域。但是,在您编辑的代码中,您引用了blog子域名 - 如果您先包含blog重定向,这将没问题。

这是一个临时(302)重定向。只有当您确定它正常工作时,才能将R更改为R=301(永久)。

在测试之前确保浏览器捕获清晰。

摘要

完整的代码如下所示:

# Redirect blog subdomain to main domain (required?)
RewriteCond %{HTTP_HOST} ^(www\.)?blog\.example\.com
RewriteRule (.*) https://www.example.com/blog/$1 [R=301,L]

# Non-www to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R=301,L]

# Non-SSL to SSL
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On    
RewriteBase /

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

最好不要在# BEGIN WordPress块之间进行编辑,以避免WordPress覆盖自定义代码。

只在代码中包含RewriteBase指令(只有最后一个实例会执行任何操作)。目前,RewriteBase指令实际上并没有做任何事情,因为你没有相对路径替换。