.htaccess 将一页的HTTP重定向到HTTPS

.htaccess 将一页的HTTP重定向到HTTPS,.htaccess,ssl,https,.htaccess,Ssl,Https,我知道这个问题已经被问得要死了,但出于某种原因,在我读过的20篇文章中,没有任何一篇对我来说是正常的,希望有人能提供一些见解 基本上,我有一个简单的购物车,我想将2个uri重定向到HTTPS、我的签出页面和我的管理文件夹: /checkout /admin 我可以使用以下代码成功重定向到HTTPS版本进行签出: RewriteEngine On #https RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^checkout https://pala

我知道这个问题已经被问得要死了,但出于某种原因,在我读过的20篇文章中,没有任何一篇对我来说是正常的,希望有人能提供一些见解

基本上,我有一个简单的购物车,我想将2个uri重定向到HTTPS、我的签出页面和我的管理文件夹:

/checkout
/admin
我可以使用以下代码成功重定向到HTTPS版本进行签出:

RewriteEngine On
#https
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^checkout https://palatinehillsestatewinery.com/checkout [R=301,L]

# remove index.php, this is just included to show everything in my .htaccess
RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L]
我发现这个和所有其他解决方案的问题是,一旦我决定返回到不应该是HTTPS的页面,url就会保持HTTPS

我一直在摸索循环等


如果有人能在这两个页面上重定向到HTTPS,然后在所有其他页面上重定向到http,那将是一个巨大的帮助,非常感谢。

这不是直接回答你的问题,但我觉得我把它作为一个答案(加上它太大了,无法作为评论发布)

我的建议:请停止使用htaccess执行此类任务(force少数URL使用HTTPS,其余URL使用HTTP)

最好的方法是为所有链接(页面,而不是资源)生成完整的URL,其中URL包括域名和协议。在这种情况下,所有URL都将立即具有适当的协议(HTTP/HTTPS)。当然:如果(出于某种奇怪的原因)请求是通过HTTP请求的,您仍然可以将(301或302重定向)请求修复为https。这就是.htaccess可以安全、方便地使用的地方

若用户将通过HTTPS请求普通页面(应该通过HTTP提供),那个么就让他来做吧,这并没有什么错。是的——HTTPS在服务器端需要更多的资源,但如果您以这种方式生成所有链接,则实际上不会出现这种情况,除非用户特别地更改协议。即使这样一个页面将通过HTTPS提供,他点击的下一个“正常”链接将是HTTP——1个额外的基于HTTPS的页面视图将不会杀死您的服务器

当站点有安全区域时,我一直在使用这种方法。。根据日志,通过“错误”协议查看/试图查看的页面视图不到0.01%——其中绝大多数是机器人程序或黑客/漏洞搜索

基于这样的统计数据,我想说——它工作得非常好。是的--您需要稍微修改代码/模板来实现这一点。。但这比搞乱.htaccess和mod_重写要好得多


在任何情况下,以下是适合您的规则:

# force https for all URLs in /checkout
RewriteCond %{HTTPS} =off
RewriteRule ^checkout https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# don't do anything for images/css/js
RewriteRule \.(gif|jpe?g|png|css|js)$ - [NC,L]

# force http for all other URLs that are not in /checkout
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/(checkout|index.php/checkout)
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# your other rules here, e.g.:
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L]


修复了你的标题,因为我怀疑你不需要将HTTP重定向到HTTP。你的方法听起来不安全,原因如下:如果你让用户在使用HTTP连接时登录,那么你将向任何窃听者公开他的登录凭据。我不知道您试图通过避免HTTPS获得什么,但请停止这样做。SSL占用的资源并不像您想象的那么多。而且它绝对不是优化页面加载速度的合适地方。嗯,出于某种原因,我仍然有一个问题。有问题的网站是palatinehillsestatewinery.com,问题正在结帐。如果您添加一些产品并尝试签出,您将看到https问题。基本上,我在这段代码中没有看到任何https重定向,相反,它似乎打破了我的“remove index.php”规则,导致url看起来像这样,没有https:palatinehillsetStateWinery.com/index.php/checkout thinks?我修改了条件:try
RewriteCond%{REQUEST_URI}^/(checkout | index.php/checkout)
而不是
RewriteCond%{REQUEST_URI}^/签出< /代码>(是的)我们必须考虑已经改写的规则——我没有充分注意到“代码> /签出/ < /COD>不是真正的文件夹/文件”这一事实。或者尝试第二种变体(抱歉——代码未经测试,因为我现在无法连接到Apache box,但应该可以正常工作)。这是一个旧答案,但值得一提的是,如果您正在调用外部库,就像在网站上乱扔社交媒体按钮时常见的情况一样,有时这些按钮无法通过HTTPS,因此,在加载不安全内容时会出现各种类型的浏览器错误。跨HTTPS加载整个站点可能会使社交性更强的web应用程序变得相当困难。在我的例子中,我的订单页面没有社会整合功能,但网站的其他部分有,因此除了订单页面之外,所有页面都需要使用HTTP,以实现“社交网络”的好处™@卫斯理大卫,你的观点绝对正确。我主要在电子商务网站工作。而且checkout+客户账户是社交/共享免费的——这些页面只有针对该客户的独特内容(通常,仅在此时有效)——共享在这里是毫无用处的。另外--您不希望有任何脚本能够(甚至可能)读取您的安全内容。@LazyOne我看到这篇文章的原因是因为我想在这个问题上执行与OP类似的规则,但遇到了一些麻烦。有兴趣的人士:
# force https for all URLs in /checkout
RewriteCond %{HTTPS} =off
RewriteRule ^checkout https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

# force http for all other URLs that are not in /checkout
RewriteCond %{HTTPS} =on
RewriteCond %{REQUEST_URI} !^/checkout
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# your other rules here, e.g.:
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ /index.php/$1 [L]