【问题标题】:.htaccess https redirect for a single page (using relative urls).htaccess https 重定向单个页面(使用相对 url)
【发布时间】:2012-04-11 13:23:44
【问题描述】:

我需要能够将单个页面从标准 http 重定向到 https。比如我想从http://domain.com/quote.php转到https://domain.com/quote.php

到目前为止,我在 .htaccess 文件中使用此代码,它适用于初始重定向。

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^quote.php https://domain.com/quote.php [R=301,L]

我的问题是,一旦我访问了 quote.php 页面并被重定向到 https 版本,我导航的所有其他站点页面都将继续使用 https 协议。这是一个潜在的重复内容问题,因为我现在可以通过 http 和 https 访问相同的内容。

所以我想要做的是能够进行上述重定向,然后以某种方式对除 quote.php 之外的所有页面反向执行相同的操作。因此,如果您尝试通过 https 访问它们,它将重定向到默认的 http 版本。

我在整个站点中都使用相对 URL,因此我不能简单地在 https/http 前缀中进行硬编码。如果可能,我需要能够通过 .htacess 执行此操作。

非常感谢任何帮助。

【问题讨论】:

  • 您可能对this answer 感兴趣:按照您的计划使用重定向可能无法达到您想要的安全程度。此外,根据您的用户是否登录,您可能需要注意您在 httphttps 变体之间共享的身份验证令牌或会话 ID。如果你的用户对https 做了一些敏感的事情,那么就没有办法回到普通的http

标签: .htaccess redirect https


【解决方案1】:
RewriteCond %{HTTPS}  off
RewriteRule  ^quote.php$  https://domain.com/quote.php  [R=301,L,QSA]

RewriteCond %{HTTPS}  on
RewriteCond %{REQUEST_URI}   !^/quote.php
RewriteRule  ^(.*)$  http://domain.com/$1  [R=301,L,QSA]

回复评论: 要将新页面添加到条件中,只需将它们放在括号中即可:

RewriteCond %{HTTPS}  off
RewriteRule  ^(quote|contact).php$  https://domain.com/$1.php  [R=301,L,QSA]

问题 2:QSA 标志将当前查询字符串添加到新 URL。默认情况下会发生这种情况,除非您更改查询字符串。您现在可以安全地删除它们,但如果您添加了查询字符串,并且还想拥有旧的,请将其放回去。


编辑 2:
上面的代码有一点安全问题:(,实际上不止一点:-D。 当您使用https 传输html 代码并且页面使用相对路径时,这很好。但是当您将这些代码放入.htaccess 时,它们会变成http,这就是问题所在:-)。把代码放在下面来解决问题:):

RewriteCond %{HTTPS}  off
RewriteRule  ^(quote|contact).php$  https://domain.com/$1.php  [R=301,L,QSA]


RewriteCond %{HTTPS}  on
RewriteCond %{REQUEST_URI}   !^/(quote|contact).php
RewriteCond %{REQUEST_URI}   !^/(.*)\.(css|png|js|jpe?g|gif|bmp)$
RewriteRule  ^(.*)$  http://domain.com/$1  [R=301,L,QSA]

现在,您在安全页面上使用的所有图像、脚本、.. 都在安全传输。

【讨论】:

  • 谢谢,这似乎工作得很好。只是几个问题: 1. 如何添加第二页以包含在独占重写规则中?比如我除了quote.php外,还需要在contact.php中添加https。我可以在这里使用某种“和”子句吗?另外,我熟悉 R=301 和 L,但在这种情况下 QSA 标志有什么作用?
  • 感谢您的更新。我注意到我收到了大量来自 Chrome、IE 和 Firefox 的混合内容错误。我查看了所有的 css、js 和图像 url,它们都使用相对 url,所以我有点困惑为什么会出现这些错误。当我没有启用此 .htaccess 重写时,这些错误似乎不会显示。您认为这会导致这些问题吗?
  • 你能把你页面的HTML代码放在这里(或http://jsfiddle.net/
  • 感谢您为此提供的所有帮助。此最新更新 (#3) 已修复安全项目问题,但现在 SSL 保持不变,即使我访问另一个不是 quote.php 或 contact.php 的页面。我需要为所有其他页面重写 http 协议。
  • 效果很好。谢谢!但是,我认为您在第 6 行有一个小代码错误,因为您列出了 index|contact 而不是 quote|contact。再次感谢所有帮助。
猜你喜欢
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 2015-12-23
  • 2017-11-03
相关资源
最近更新 更多