强制某些页面使用https,其他所有页面使用http

时间:2014-01-05 14:32:29

标签: apache .htaccess http ssl https

.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。

我的.htaccess文件

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的调用。

1 个答案:

答案 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]