将所有流量重定向到HTTPS,除了一个目录应该强制HTTP

时间:2016-06-01 12:25:26

标签: apache .htaccess

我尝试从很多帖子重写条件,但似乎都没有。

我想在整个网站上强制HTTPS。除了必须将一个目录强制为HTTP

www.example.com的所有内容都应为HTTPS

dir3www.example.com/dir1/dir2/dir3/test.php中的任何内容都应该被强制HTTP

这是我到目前为止所拥有的。

RewriteEngine On

# Redirect HTTP traffic to HTTPS
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

RewriteCond %{HTTPS} on
RewriteRule ^dir3/ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

2 个答案:

答案 0 :(得分:4)

我发现一些有效的东西,但可能不是最优雅的解决方案。

RewriteEngine On

# Redirect HTTP traffic to HTTPS, except dir3 directory
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/dir1/dir2/dir3/
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

答案 1 :(得分:0)

使用Redirect和RedirectMatch指令精确控制哪些区域被强制设置为http,哪些区域被强制设置为https。如果要客户端浏览器缓存重定向(即,如果它确实是永久的),则将永久关键字用于301重定向,或者对于302(临时)重定向,则将其忽略。请注意,在测试是否使用永久性时,浏览器将缓存重定向,并且在此之后所做的任何更改都将不会显示...清除浏览器中的重定向缓存可能会令人沮丧。

<VirtualHost *:80>
    ServerName www.example.com

    # Redirect everything except /dir1/dir2/dir3 to use https
    RedirectMatch permanent "^(/(?!dir1/dir2/dir3/?).*)" https://www.example.com$1

    # config for the http://www.example.com/dir1/dir2/dir3/ stuff goes here
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com

    # Redirect /dir1/dir2/dir3 to use http
    Redirect permanent /dir1/dir2/dir3 http://www.example.com/dir1/dir2/dir3

    # config for the https://www.example.com/ stuff goes here
</VirtualHost>

为使情况保持整洁,您可能还希望同时在端口80和端口443上重定向example.com,以确保始终在www.example.com上访问您的站点。您可以改用上面的VirtualHosts中的ServerAlias,但是指定重定向会强制客户端浏览器中的名称始终显示www.example.com,而不显示请求来自的名称。大多数网站的首选是强迫所有人(重定向)到www.example.com。

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent /dir1/dir2/dir3 http://www.example.com/dir1/dir2/dir3
    Redirect permanent / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    Redirect permanent /dir1/dir2/dir3 http://www.example.com/dir1/dir2/dir3
    Redirect permanent / https://www.example.com/
</VirtualHost>