【问题标题】:.htaccess determine if refferer is not current domain.htaccess 确定引用者是否不是当前域
【发布时间】:2012-02-14 14:14:43
【问题描述】:

我正在尝试创建一个 .htaccess mod_rewrite,如果当前引用者不是我自己的域,它将表现不同。例如,假设我拥有 example.com(即 www.example.com、http://example.com 等)。当有人访问 example.com(或 beta.example.com 等子域)时,我想忽略这个 .htaccess 规则。所以我猜这个正则表达式基本上只是在其中的某个地方寻找 example.com 而忽略那些。

但是,如果是诸如 otherdomain.com 之类的域(假定通过 cname 或 A-record 指向 example.com)访问我的站点,我想将它们重定向到某个地方。这是我到目前为止所拥有的,我认为很接近但不起作用。

我对这些规则的主要困惑是 RewriteRule 之后的部分(在本例中为 ^$)。我在谷歌搜索中看到了一些不同的东西,我不确定它们之间的差异。例如,我也只看到过 ^、(.*)$ 等。

RewriteCond %{HTTP_REFERER} !^http://([^.]+\.)*(example)\.com
RewriteRule ^$ redirectfile.php [L]

我也一直在搞砸

RewriteCond %{HTTP_REFERER} ^http://(.+\.)*\.com
RewriteCond %1 !^(example)\.$
RewriteRule ^$ redirectfile.php [R=302,L]

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite http-referer


    【解决方案1】:

    试试

    RewriteCond %{HTTP_REFERER} !^http://([^.]+\.)*example\.com 
    RewriteRule ^ redirectfile.php [L]
    

    你有^$,它只会匹配主页。

    我将其更改为 ^,它将匹配每个请求,假设您想要匹配每个请求。

    (.*)$ 也将匹配每个请求,但也会捕获匹配项,以便您在目标中作为 $1 重用

    【讨论】:

    • 感谢您的解释。不过,这些规则似乎不起作用。无论如何,它总是重定向。我正在使用 random.example.com (这个应该忽略规则)和 test.local (它指向同一个服务器但应该遵循规则)进行测试。在每种情况下,我都将其重定向到转储 $_SERVER 且 HTTP_REFERER 为空的 PHP 文件,因此我尝试使用具有正确值的 HTTP_HOST。不过,在规则上仍然没有运气。是因为 HTTP_HOST 不包含像那个正则表达式那样的 http 吗?
    • 所以我的最后一句话一定是它。我取出了http部分并使用了HTTP_HOST,它现在可以工作了。使用 HTTP_HOST 安全吗?无论如何,它可能比 HTTP_REFERER 更可靠,对吧?
    • @joshholat HTTP_HOST 更可靠,但它始终会为您提供您请求的页面的域,而不是您来自的页面的域。如果你需要后者,那么你应该使用HTTP_REFERER。请注意,如果您直接在浏览器中输入 URL、将其添加为书签或来自安全页面,HTTP_REFERER 将为空白(空字符串)。
    • 啊,我是直接输入的 :-P 谢谢,您的回复很有帮助。 HTTP_HOST 实际上应该是我所需要的。我刚刚修改了正则表达式的 http 部分以使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多