mod_rewrite规则允许在没有SSL的情况下提供单个URL

时间:2014-11-17 14:36:14

标签: apache .htaccess mod-rewrite

嗨,目前我有一个重写规则强制SSL下的所有请求。我想将单个URL前缀列入白名单以忽略此规则,因此只能在两个协议下提供该URL。

原则:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我尝试更新规则:

RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} ^/preview/(.*)$
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

任何以/ preview / blah / blah开头的网址都应该从重定向中忽略。

关于我做错的任何想法?

[edit]

如下所述更改规则,它似乎不会处理第二条规则?这是我的全部.htaccess:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

当我转到/ preview / blah时,它会将网址更改为https://domain.com/index.php?/preview/blah

[edit2]

Darn浏览器缓存!它有效:)

1 个答案:

答案 0 :(得分:2)

你只是否定 ! RewriteCond。这应该是您所需要的(尽管您可以通过删除()捕获组和$锚点来简化它。)

RewriteCond %{SERVER_PORT} 80
# Negate the condition with !, and the (.*)$ isn't needed.
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^.*$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

我可能会简化RewriteRule以仅匹配^,因为没有.*捕获组的()匹配“任何或任何东西”然后只是抛出它远。如:

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

我的其他建议不是匹配端口80,而是覆盖您在80以外的端口(例如开发中)服务的可能情况,匹配%{HTTPS} !on。所以总的来说:

# Instead of 
# RewriteCond %{SERVER_PORT} 80
# Your first condition can be
RewriteCond %{HTTPS} !on
RewriteCond %{REQUEST_URI} !^/preview/
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]