如何使用.htaccess将HTTPS重定向到某些页面的HTTP

时间:2011-07-25 04:49:44

标签: http .htaccess https url-rewriting

我使用.htaccess面临网址重写问题。

除了4个网址,我必须将所有网址重定向到HTTPS。下面是我的.htaccess文件中的代码:

RewriteEngine On
Options +FollowSymlinks
RewriteBase /

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_REFERER} !^https(.*)/(.*)$ [NC]
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{REQUEST_URI} ^/?index\.php$ [NC]
RewriteCond %{REQUEST_URI} ^/?index\.php?view=default [NC]
RewriteCond %{REQUEST_URI} ^/?index\.php?view=news [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301, NC, L]

# Require SSL on all other pages
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}r%{REQUEST_URI} [R=301, NC, L]

我需要为以下网址禁用HTTPS:

  1. mydomain.com/
  2. mydomain.com/index.php
  3. mydomain.com/index.php?view=new
  4. mydomain.com/index.php?view=new&abc=xyz&aaa=bbb…
  5. mydomain.com/index.php?view=default
  6. 对于5个以上的网址,我想在http中重定向,但它不起作用。它仅将所有URL重定向到HTTPS。

2 个答案:

答案 0 :(得分:1)

RewriteCond条件的行为类似于“和”,因此它不会同时匹配所有4个文件模式。一种选择是单独的规则 - 我喜欢在搞清楚时这样做。另一种选择是使“或”模式起作用。

查询字符串在RewriteCond中处理,而不是在RewriteRule中处理。

我不确定你需要在HTTP_REFERER上测试什么,所以我把它留了出来。

这分为两个规则以保持简单。第一个是没有参数的普通斜杠或可选的index.php。第二个检查查询字符串的view = default或new。

RewriteCond %{HTTPS} on
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{REQUEST_URI} ^/(index\.php)?$ [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301, NC]

RewriteCond %{HTTPS} on
RewriteCond %{QUERY_STRING} ^view=(default|new(&.*)?)$ [NC]
RewriteCond %{REQUEST_URI} ^/?index\.php$ [NC]
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301, NC]

查询字符串条件完全检查view=default,或view=newview=new&any=other...可选的&.*表示下一个必须是&符号或什么都没有,这会阻止view = new2来自错误匹配。

请注意,当您将其从https重定向到http时,用户可能会收到有关重定向到“不安全”页面的浏览器警告。重定向警告不再是一个大问题;我只记得IE6的日子。 How to redirect from HTTPS to HTTP without annoying error messages

修改 我为空查询字符串的第一条规则添加了一个条件。我意识到没有它就匹配任何查询字符串。

答案 1 :(得分:0)

我也遇到了这个问题,对我来说这个帮助

RewriteCond %{HTTPS} !^on$
RewriteCond %{REQUEST_URI} ^(/check-out|/payment)$
RewriteRule (.*) https://www.my_site.com/$1 [R,L]

您需要更改网页名称和您的网站网址。