嗨,目前我有一个重写规则强制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浏览器缓存!它有效:)
答案 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]