忽略我们是否应该做出这个改变的好处(情况稍微复杂一点,可能是我的保密协议涵盖的),我们的客户希望我们要求我们正在build设的网站的访问者来自他们的另一个网站。 如果用户从其他地方访问我们,则应将其发送到其他网站的login屏幕。
感觉最简单的方法是使用mod_rewrite来redirect任何与既不是我们的网站也不是另一个的引用。
我目前的想法是
在httpd.conf
RewriteMap deflector txt:/path/to/deflector.map RewriteCond %{HTTP_REFERER} !="" RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} =NOT-FOUND RewriteRule ^ http://www.theothersite.com/login.jsp [R=307,L]
在deflector.map
//www.oursite.com/ - //oursite.com/ - //www.theothersite.com/ - //theothersite.com/ -
这可以让我们很容易的扩大“允许转介人”的名单,这感觉是一个好主意。
那么我有三个问题:
mod_rewrite (我们已经广泛使用)这样做的最好方法? 307 Temporary Redirect是一个307 Temporary Redirect响应的最好办法呢? 在我看来, 307 Temporary Redirect或403 Forbidden是最合适的状态码 ,我认为这是一个坏事™发送Location:redirect头与4xx响应。
这一切都有道理?
编辑:默认情况下,地图search是否区分大小写? 我需要担心这里的情况吗?
编辑2:地图search正则expression式search还是全键匹配? 如果地图包含www.foo.com和Referer:标题读取http://www.foo.com/bar.php它将匹配?
我认为地图会区分大小写,而且你需要从Referer提取主机名。 我还没有testing过,但是这样的事情可能会起作用:
RewriteMap deflector txt:/path/to/deflector.map RewriteMap lc int:tolower RewriteCond %{HTTP_REFERER} ^https?://([^:/?]+) RewriteCond ${lc:%1} (.+) RewriteCond ${deflector:%1|NOT-FOUND} =NOT-FOUND RewriteRule ^ http://example.com/ [L]
不要使用不寻常的响应代码。 302的默认值是好的。
我们最终做的是如下:
RewriteCond %{REMOTE_HOST} !ABC(D|E) RewriteCond %{HTTP_HOST}==%{HTTP_REFERER} !^(.*?)==https?://\1/ [NC] RewriteCond %{HTTP_REFERER} !https?://referring.domain.com/ [NC] RewriteRule ^ https://referring.domain.com/path/to/login/script [R,L]
第一个RewriteCond (以及其他几行)意味着开发人员和客户不受限于此推荐人支票(因为在进入我们的网站之前必须先到那里去真的很烦人)。
第二个RewriteCond是一个天才工作,用来检查引用者是否与Host:相同Host:在请求中。 这是基于terrye 对SO#7398191的回答:genericsmod_rewrite引用者检查 – 因为mod_rewrite只在testingstring中进行variables插值,所以不能有行读取
RewriteCond %{HTTP_HOST} !^https?://%{HTTP_REFERER}/ [NC]
因为它根本不会做这个检查。
显然我们“永远不会”需要允许任何其他推荐人。 如果我们这样做,我想我只需要设置最后一个RewriteCond行来结束[NC,OR]并链接更多的条件。
所有的工作很好。 谢谢大家的帮助!