PHP 仅允许特定的来源域名访问页面,php parse url,详解php parse_url()函数的定义与用法

假设只允许域名来源是是goods5.cn的,才能访问 goods5.cn/page.html,直接不可以访问这个页面,,我使用了以下方法允许通过引荐来源网址的域名访问 php 脚本,但我只想允许与完整 url 匹配的引荐来源网址访问。


if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] != 'goods5.cn/page.html')
{
echo "Eexcuting code here";
} else {
echo('Hot Linking Not Permitted');
// display some message / image / video
exit;
}
?>

因此,如果引用网址匹配 goods5.cn/page.html然后允许访问 else if 阻止它。
因为引荐来源数据很容易被欺骗。但是,如果它仍然满足您的需求,那么您应该已经可以使用您的代码了,因为 $_SERVER[‘HTTP_REFERER’] 包含完整的引荐来源网址,而不仅仅是域。实际上,您当前的代码需要一些调整,`


// This is to check if the request is coming from a specific domain
$ref = $_SERVER['HTTP_REFERER'];
$refData = parse_url($ref);

if($refData['host'] !== 'goods5.cn') {
  // Output string and stop execution
  die("Hotlinking not permitted");
}

echo "Executing code here";
?>

php 中 parse_url()函数是解析 URL,并返回url的组成部分。它的语法如下:

语法array parse_url(string $url,int $component)

参数详解参数名参数说明

$url要解析的 URL,无效字符将使用 _ 来替换。

$component指定 PHP_URL_SCHEME、 PHP_URL_HOST、 PHP_URL_PORT、 PHP_URL_USER、 PHP_URL_PASS、 PHP_URL_PATH、 PHP_URL_QUERY 或 PHP_URL_FRAGMENT 的其中一个来获取 URL 中指定的部分的 string。 (除了指定为 PHP_URL_PORT 后,将返回一个 integer 的值)。

ps :本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url()会尝试尽量正确地将其解析。通过下面一个实例


<?php

$url = "http://www.codeit.org.cn:8080/index.php?name=wxp&id=2";

$parts = parse_url($url);

print_r($parts);

?>

也可以通过htaccess文件来实现这个效果

我试图建立一个能够完成以下一个htaccess文件:

只允许查看我的网站,如果查看用户从特定域来(链接)

因此,举例来说。 我有一个名为域。 protect.mydomain.com。 我只希望人们从unprotected.mydomain.com的链接来能够访问protect.mydomain.com。

最大的悬而未决的问题我有是,如果你从unprotected.mydomain.com得到protect.mydomain.com并单击在转到另一个页面下protect.mydomain.com那么protect.mydomain.com的链接我就被送进回到我的重定向,因为HTTP_REFERER是protect.mydomain.com。 因此,要打击,我把一张支票,让引荐是protect.mydomain.com为好。 它不工作,并访问来自世界各地的允许。 这是我的htaccess文件。 (这一切都是在HTTPS)

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_REFERER} ^https://(.+.)mydomain.com
RewriteCond %1 !^(protect|unprotected).$
RewriteRule ^.
$ https://unprotected.mydomain.com/ [R=301,L]
Answer 1:
您对符合引用者^https://(.+.)*mydomain.com 。 这意味着如果一些完全其它网站,说http://stealing_your_images.com/链接上protect.mydomain.com东西,第一个条件会失败,因此请求永远不会重定向到https://unprotected.mydomain.com/ 。 你想从另一个方向接近它,只允许特定的参照网址通过,那么其他一切重定向:

RewriteEngine On
RewriteBase /

allow these referers to passthrough

RewriteCond %{HTTP_REFERER} ^https://(protect|unprotected).mydomain.com
RewriteRule ^ - [L]

redirect everything else

RewriteRule ^ https://unprotected.mydomain.com/ [R,L]

你可能感兴趣的:(php,开发语言)