在.htaccess
( Apache 2.4.6 )文件中,我这样做:
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{REQUEST_URI} ^\/(login|checkout)\/?(.*) [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
因此,如果我的用户进入http://
网站/登录,他会被重定向到https://
网站/登录。 checkout
页面的内容相同。
但是,对于所有其他页面,我不希望允许访问https
协议。在这种情况下,我希望强制301重定向到http
协议。
例如:如果我的用户访问https://
网站/产品,我需要将其重定向到http://
网站/产品。
所以,我添加了一个新的RewriteCond
否定正则表达式,如下所示:
RewriteCond %{HTTPS} =on [NC]
RewriteCond %{REQUEST_URI} ^\/((?!login|checkout))\/?(.*) [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
但它不起作用。
对此问题的任何想法? TKS。
Options +FollowSymLinks -MultiViews
DirectoryIndex index.php
RewriteEngine On
# Force HTTP to HTTPS
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{REQUEST_URI} ^/index.php/(login|checkout) [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# Force HTTPS to HTTP
RewriteCond %{HTTPS} =on [NC]
RewriteCond %{REQUEST_URI} !^/index.php/(login|checkout) [NC]
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# From /index.php/ to /
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php/?$ /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
第一条规则,如果我的用户进入/index.php/
登录,则会将其重定向到/login
,从URI中删除/index.php/
。
最后一条规则委托对request dispatch
(前端控制器)的所有对index.php的调用。
答案 0 :(得分:1)
你的负向前瞻似乎不正确。
你也可以用更简单的语法否定早期的URI匹配条件。总的来说,这两条规则应该有效:
Options +FollowSymLinks -MultiViews
DirectoryIndex index.php
RewriteEngine On
# Force HTTP to HTTPS
RewriteCond %{HTTPS} =off [NC]
RewriteCond %{THE_REQUEST} /(login|checkout) [NC]
RewriteRule ^(login|checkout) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# Force HTTPS to HTTP
RewriteCond %{HTTPS} =on [NC]
RewriteCond %{THE_REQUEST} !/(login|checkout) [NC]
RewriteRule !^(login|checkout) http://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
# From /index.php/ to /
RewriteCond %{THE_REQUEST} ^.*/index.php
RewriteRule ^(.*)index.php/?$ /$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Delegate all requests to the index.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ /index.php [L]