使用.htaccess在HTTP和HTTPS之间正确切换

Ali*_*olt 20 .htaccess ssl https http

我们有一个购物网站,我们在共享主机(Mediatemple Gridserver)上托管.站点的某些部分需要使用HTTPS(checkout等),但其余部分应该使用HTTP.

有谁知道我们如何能够始终强制正确使用特定URL的HTTP/HTTPS?我们已经让它在各种状态下工作,但是我们无法获得应该在HTTP上的页面的请求,但是请求使用HTTPS来正确切换回来.

我已经看了一眼,但找不到合适的答案.

Cur*_*ker 36

我在wordpress中使用类似于我的管理文件夹的东西:

#redirect all https traffic to http, unless it is pointed at /checkout
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/checkout/?.*$
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

RewriteCond %{HTTPS} on部分可能不适用于所有Web服务器.RewriteCond %{HTTP:X-Forwarded-SSL} on例如,我的webhost需要.

如果您想强制反向,请尝试:

#redirect all http traffic to https, if it is pointed at /checkout
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/checkout/?.*$
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)

如果您想要一些其他方法,请查看askapache.

  • [@ wilmoore](http://stackoverflow.com/questions/1108706/correctly-switching-between-http-and-https-using-htaccess/#9917579)建议使用'%{SERVER_NAME}`添加会很有用 (2认同)
  • 我不得不使用这个检查来使它工作`RewriteCond%{HTTP:X-Forwarded-Proto}!https` (2认同)

Wil*_*III 15

这应该适用于几乎所有场景,并且应该在您的实际vhost或.htaccess中工作:

RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

(不要忘记%{REQUEST_URI}之前的斜杠,因为这可能允许传递一个portnumber,这很危险)


Sja*_*ish 6

RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

我在loadballancer背后遇到了一些问题.这是我如何解决它.

  • 这真的有效吗?它让我陷入了重定向循环。如果您有负载均衡器,则不会设置 HTTPS,并且将满足第一个 RewriteCond。如果不这样做,将遇到第二个 RewriteCond。因此,每次您都会再次被重定向。我使用(另一个答案)[http://stackoverflow.com/a/26623196/2182900] 基本相同,但没有“[OR]” - 只有在 HTTPS 和 HTTP 都关闭时才重定向:X-Forwarded-Proto 不是 https。 (2认同)