如何从 $_SERVER['HTTP_REFERER'] 中仅选择根域名?

30
我希望有一个404页面,能够检测用户是通过我的网站、我的短链接还是其他网站跳转到该页面的,并且我正在使用PHP制作。我对PHP有一些了解,这可能是一个简单的问题,但老实说我很累,身体里没有咖啡因,我想尽快完成我的作品集。
我发现$_SERVER['HTTP_REFERER']; PHP变量可以给我整个URL,这是一种起点。是否有一种方法可以通过另一个变量或函数只提供根域名呢?需要注意的是,有些引用可能使用http://和https://(因此简单地从第七个字符开始并不总是适用)。这样,我就可以基于两个(或更多)预定义的地址匹配URL,并生成与该域相关的内容。
4个回答

61

太棒了!那个完美地运行了,除了我无法对301重定向的URL执行相同的操作,这可能会导致我的URL缩短器出现问题。没关系,我会找到解决办法的。 - Nathan Bunn
顺便问一下,URL很容易被欺骗吗?有人能轻易地欺骗我的域名吗?怎么做到的? - Nathan Bunn
我想说的是 referer 很容易被欺骗。它只是请求的 HTTP 标头中的任意、可选、自愿数据。客户端可以在那里发送任何它想要的内容。有一些浏览器插件可以将 referer 更改为任何你喜欢的内容。 - deceze
哦,非常抱歉,感谢您再次向我解释。老实说,我对此并不太担心,因为这些数据仅用于显示在404页面上,而不被记录,但还是非常感谢您的提醒。我之前不知道这一点,感谢您让我知道。 - Nathan Bunn

3

0
不要使用正则表达式或 parse_url,因为它们会消耗大量资源。最好使用其他方法。
trim(substr($_SERVER['HTTP_REFERER'], strpos($_SERVER['HTTP_REFERER'], '/')+2), '/')

或者如果引用始终以斜杠结尾:

substr($_SERVER['HTTP_REFERER'], strpos($_SERVER['HTTP_REFERER'], '/')+2, -1)

-1

这应该可以:

 $_SERVER['SERVER_NAME']

1
这并不是一个很好的选择,因为如果您使用子域名,例如 potato.domain.com,而您想要获得 domain.com 作为结果,这种方法将失败。原帖中确实提到了根域名。 - Cassandra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接