强制单个站点使用https,所有其他http(wordpress)

时间:2016-01-21 10:30:20

标签: regex wordpress apache .htaccess mod-rewrite

我发现了几个相关问题,但非主题似乎有效,所以我不得不再问:

我使用的是wordpress网站,我想要一个网站使用https(/kontakt/)。所有其他网站都必须使用http(由于内容重复等原因)。

我尝试了一个名为Wordpress HTTPS的插件,应该这样做,但插件已过时(3年没有更新),也没有按预期工作。

对于这种情况,我考虑过使用.htaccess。这些是我的htaccess文件:

我的网址与此完全相同: http://www.example.com/kontakt/

# 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]    

# END WordPress
RewriteCond %{HTTPS} off
RewriteRule ^kontakt/$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,NE,NC]

# change kontaktform
RewriteCond %{HTTPS}  off
RewriteRule  ^/kontakt https://www.example.com/kontakt/  [R=301,L,QSA]

RewriteCond %{HTTPS}  on
RewriteCond %{REQUEST_URI}   !^/kontakt/
RewriteRule  ^(.*)$  http://www.example.com/$1  [R=301,L,QSA]

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

</IfModule>

此尝试取自此处:

force one page to use HTTPS and the others to use HTTP with .htaccess

但是没有做到这一点。我现在的问题是:

a)该网站未被重定向到https(我可以确认htaccess正在运行,因为我可以按需生产500个)

b)一旦它在https://上,所有其他方都保留在该协议上(已经在链接预览中)

我真正想要的是什么:

如果网站= / kontakt / - &gt;使用https

ELSE使用HTTP

1 个答案:

答案 0 :(得分:1)

请尝试以下规则:

RewriteEngine On
RewriteBase /

# add www if missing in domain name
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=302,NE,L]

# if http and /kontakt/ then make it https
RewriteCond %{HTTPS} off
RewriteCond %{THE_REQUEST} /kontakt/ [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,NE,NC]

# if https and NOT /kontakt/ then make it http
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} !/kontakt/ [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [R=302,L,NE,NC]

# default WP rules

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]

我为此使用了%{THE_REQUEST}变量。 THE_REQUEST变量表示Apache从您的浏览器收到的原始请求,并且在执行一些与%{REQUEST_URI}变量不同的重写规则后,不会被覆盖。

在测试之前清除浏览器缓存,并在Chrome开发工具中测试,并禁用缓存。