-1

我是 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 推荐人包含

https://mysite... 

并且请求的网址有

http://mysite.net/something 

将其重写为

https://mysite.net/something". 

反之亦然。

但我不太了解 apache mod_rewrite 和 regex 也不知道该怎么做。在 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]
4

1 回答 1

0

对此没有 mod_rewrite 解决方案,因为当重写规则运行时,已经发出请求并且已经发生了任何不良副作用。当您检查是否是用户单击 https 链接时,错误的证书警告已经发生,因为证书是在发出请求之前发送的。当版主单击非 https 链接时,请求已经发出并且 cookie 未发送,版主已注销。虽然,安全 cookie 可能不会被 HTTP 请求覆盖,并且当主持人切换回 HTTPS 时,旧的会话 cookie 会被保留。

确实需要对您的论坛软件进行修复。只需删除https://mysite.net部分,一切都会正常工作。

于 2012-12-26T19:43:05.197 回答