[英]Prevent direct access to a php file that would be loaded in another server
我有这个文件 style.php 将用作几个域的主要 css 样式。 此 style.php 文件将在“网站 1”上可用,而其余网站将从网站 1 加载它。
对于网站 1。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Website one </title>
<link rel="stylesheet" href="style.php">
</head>
<body>
</body>
对于网站 2。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Website one </title>
<link rel="stylesheet" href="https://website1.com/style.php">
</head>
<body>
</body>
对于网站 3。
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title> Website one </title>
<link rel="stylesheet" href="https://website1.com/style.php">
</head>
<body>
</body>
其他几个网站也是如此。
现在这是我想做的事情,我不想直接访问网站 1 的 style.php。例如,如果用户访问https://website1.com/style.php ,他不应该可以访问它。
这就是问题所在,当我使用 .htaccess 拒绝访问它时,网站 2 和 3 将无法加载 css。
我可以对 style.php 进行任何可能的调整,以便当用户访问https://website1.com/style.php时,他将无法访问它,但当它用作样式表时网站2和3,它会正常加载css吗?
最简洁的答案是不”。
更长的答案是你对当前正在发生的事情有一个不正确的心理模型。 您想象当您从网站 2 引用样式表时,请求以某种方式“来自”该网站。 实际发生的是这样的:
您的两台服务器在任何时候都不会相互通信; 他们总是从浏览器接收请求并向浏览器发送响应。 如果服务器在第 5 步拒绝请求,浏览器将永远不会知道样式表包含什么,因此只会呈现没有这些样式的页面。
考虑到这一点,我们可以重新提出问题:
我能否确定浏览器请求 URL 的原因,以区分在地址栏中键入 URL 的用户与在我的一个站点上使用的样式表。
答案可能是:浏览器可以发送一个名为“REFERER”的 HTTP 标头(是的,这是“referrer”的拼写错误,但很久以前它就成为标准了),它为 URL 提供了请求“来自“ 在某种意义上。 对于直接键入的 URL,它将始终为空; 对于样式表 URL,它可能是包含页面。 您可以在 PHP 中以$_SERVER['HTTP_REFERER']
形式访问它,或者在 Apache 配置中通过将RewriteCond %{HTTP_REFERER} some-pattern-to-match
放在RewriteRule
前面来访问它。
但是,出于隐私原因,浏览器最近对在域之间传递引荐来源信息变得更加严格,因此在您的情况下它可能是空白的。
同样重要的是要注意请求中的所有内容都在用户的完全控制之下,并且响应中的所有内容对用户都是完全可见的。 一旦你发现这是需要的,发送带有假 REFERER 标头的请求是微不足道的。 在使用样式表的站点上查看样式表更加简单——在大多数浏览器中,按 F12 将弹出“开发人员工具”,您可以在其中查看服务器发送的所有内容。
因此,如果您希望以某种方式“保密”这些样式,那您就不走运了。 用户需要能够看到浏览器的样式才能使用它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.