htaccess重写基于当前URL或referrer的内部链接

时间:2012-12-26 11:48:55

标签: .htaccess mod-rewrite https

我是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]

1 个答案:

答案 0 :(得分:0)

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

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