【问题标题】:Restrict access to webpage from single referrer domain using .htaccess使用 .htaccess 限制从单个引用域访问网页
【发布时间】:2016-08-16 12:41:37
【问题描述】:

我想限制对网站的访问,只允许来自单个域的推荐人。我无法让 .htaccess 文件正常工作。 假设我指的是http://domainname.com - 将允许访问。 或http://subdomain.domainname.com - 将允许访问。

但是任何其他推荐人(或输入 URL)都会阻止,并直接访问拒绝访问页面。

代码如下(注意我需要允许从 domainname.com 上的任何引用页面访问

RewriteEngine On
RewriteBase /

# allow these referers to passthrough
RewriteCond %{HTTP_REFERER} ^http://(protect|unprotected)\.domainname\.com
RewriteRule ^ - [L]

# everybody else receives a forbidden
RewriteRule ^ - [F]

ErrorDocument 403 /forbidden.html

【问题讨论】:

  • 我们需要查看您的代码...没有它就无法帮助。
  • 请将您的代码添加到问题中(edit 按钮)并删除评论 - 无法读取 cmets 中的代码。
  • 问题是什么 - 它是否授予其他推荐人访问权限?您可能想要删除第一个 RewriteRule,但您必须在引用 URL 前添加一个否定符:!^http:...
  • 不,它似乎也阻止了我允许的推荐人。

标签: .htaccess


【解决方案1】:

HTTP 引用标头仅说明请求来自。例如。当某个网页中有来自www.example.net的链接时

<a href="http://www.example.com/some/path>Click here</a>

那么请求将针对http://www.example.com/some/path,并且referer 标头将包含来自www.example.net 的URI。

如果您在没有特定引用者的情况下阻止任何请求,那么任何直接请求也将被阻止。另请注意,referer 标头是由客户端发送的,因此它不是一个可靠的指标。

另一个需要注意的是,根据Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content- 5.5.2 Referer,客户端可能会发送一个partial-URI,它根本不包含域名。


要回答您的问题,如果您想允许来自 domainname.com 或其任何子域的请求,您可以检查

RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)?domainname\.com
RewriteRule ^ - [L]

RewriteRule ^ - [F]

反之,否定时禁止

RewriteCond %{HTTP_REFERER} !^http://(?:.*\.)?domainname\.com
RewriteRule ^ - [F]

要检查多个条件之一,cond1 或 cond2 或 cond3,您必须使用 RewriteCondornext|OR 标志,例如

RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)?nature\.com [OR]
RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)?adclick\.g\.doubleclick\.net [OR]
RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)?onepointedpixel\.com
RewriteRule ^ - [L]

【讨论】:

  • 谢谢。从测试 URL 工作,但是当我从客户端横幅广告中单击时,它失败了。 (横幅点击通过广告点击 URL,这会导致问题吗?)应该允许从列表中的所有 URL 访问,拒绝一切。但我确实希望允许用户进行页面刷新。 RewriteEngine On RewriteBase / RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)?nature\.com RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)? adclick\.g\.doubleclick\.net RewriteCond %{HTTP_REFERER} ^http://(?:.*\.)?onepointedpixel\.com RewriteRule ^ - [L] RewriteRule ^ - [F]
  • 我还想问:我需要在引用域上指定引用文档,还是只指定域,所以如果我的引用者是nature.com/nrg/index.html?test=ads,我需要指定整个URL吗?
  • 你可以检查任何你喜欢的,这只是一个正则表达式。当正则表达式匹配时,条件为真,当正则表达式不匹配时,条件为假。这取决于您想要达到的目标。此外,当您有多个RewriteConds 时,条件必须全部为真。如果只想匹配其中一个,则必须使用[OR],见RewriteCond
  • 谢谢奥拉夫。抱歉,这不是我的专业领域...如果我想检查 url1 是否为真或 url2 是否为真或 url3 是否为真,语法是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 2014-08-10
  • 2015-10-07
  • 2021-06-07
  • 2014-02-05
  • 2014-12-30
  • 2015-12-03
相关资源
最近更新 更多