我是htaccess,apache和regex的真正初学者,所以如果我问愚蠢的问题,请原谅我。
以下是我的理由:
我有一个论坛,允许用户访问
http://mysite.net or
https://mysite.net.
这个想法是,它是一个带有自签名证书的廉价共享主机上的业余爱好项目,所以我真的只需要为主持人提供https - 普通用户,访客,搜索引擎都应该使用HTTP。
论坛软件似乎对相关链接有点无知,并且始终为内部页面创建绝对链接。因此,如果使用论坛HTTP版本的用户发布内部链接到另一个主题,那么它将是
http://mysite.net/topic....
如果使用HTTPS版本的用户发布内部链接,那将是 HTTPS:// ...
问题:
如果来自HTTP版本的用户单击HTTPS链接,他将被重定向到https站点,这是不受欢迎的,因为来自浏览器恐慌用户的自签名证书会发出警告。如果主持人从HTTPS版本点击HTTP链接,那就更糟了,因为他没有记录(我确实使用了安全会话cookie,并且在那个场景中会话中断了!)。
解决方案:
我在考虑htaccess重写规则,比如“IF referrer contains
”https://mysite...
AND请求网址
http://mysite.net/something
将其重写为
https://mysite.net/something".
反之亦然。
但我真的不明白apache mod_rewrite和正则表达式,不知道该怎么做。在Stackoverflow上搜索了很多教程和一些问题,但无法调整这些示例。我得到的唯一结果是无条件/无条件重定向/无限循环。
以下是一些经过验证的规则,但这些规则对我不起作用:
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^https://mysite\.net [NC]
RewriteCond %{REQUEST_URI} ^http://mysite\.net [NC]
RewriteRule ^(.*)$ https://mysite.net/$1 [R=301,NC,L]
或
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
答案 0 :(得分:0)
没有针对此的mod_rewrite解决方案,因为在重写规则运行时,已经发出请求并且已经发生了任何不良副作用。当您检查用户是否单击https链接时,已发生错误证书警告,因为证书在发出请求之前已发送 。当主持人点击非https链接时,已经发出请求并且未发送cookie,主持人将被注销。虽然,HTTP请求可能不会覆盖安全cookie,但当主持人切换回HTTPS时,会保留旧的会话cookie。
您的论坛软件确实需要 。只需要删除 https://mysite.net 部分,一切都会正常工作。