我使用.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:
mydomain.com/
mydomain.com/index.php
mydomain.com/index.php?view=new
mydomain.com/index.php?view=new&abc=xyz&aaa=bbb…
mydomain.com/index.php?view=default
对于5个以上的网址,我想在http中重定向,但它不起作用。它仅将所有URL重定向到HTTPS。
答案 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=new
或view=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]
您需要更改网页名称和您的网站网址。