Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用php输出js文件,并检测文件是嵌入的还是直接打开的_Php - Fatal编程技术网

如何使用php输出js文件,并检测文件是嵌入的还是直接打开的

如何使用php输出js文件,并检测文件是嵌入的还是直接打开的,php,Php,如何使用php输出js文件并检测文件是嵌入的还是直接连接的 我想用php输出一些js文件 这很简单,就像: header(Content-Type: text/javascript); 但我想知道该文件是否嵌入到网页中,如: <script src='http://foo.com/foo.js'></script> 或者直接在浏览器中打开 谢谢您无法分辨接收端的差异。这两种情况下的请求都是相同的,web服务器将以完全相同的方式为foo.js提供服务。如果您控制嵌入

如何使用php输出js文件并检测文件是嵌入的还是直接连接的 我想用php输出一些js文件 这很简单,就像:

header(Content-Type: text/javascript);
但我想知道该文件是否嵌入到网页中,如:

<script src='http://foo.com/foo.js'></script>

或者直接在浏览器中打开
谢谢

您无法分辨接收端的差异。这两种情况下的请求都是相同的,web服务器将以完全相同的方式为foo.js提供服务。如果您控制嵌入javascript的HTML页面,则可以构造一个令牌/散列方案(就像您可能防止CSRF那样)来验证对文件的请求不是直接请求。例:

<script src="http://foo.com/foogenerator.js.php?k=SOMERANDOMVALUE"></script>


但这样做的问题是,它包括让PHP解析器生成javascript的开销,而不仅仅是由web服务器直接提供的静态文件。它还可能对浏览器缓存产生影响。

您可以使用
.htaccess
将请求重新路由到PHP文件,如:(我没有测试它,但我认为它应该可以工作)

您的
.htaccess
文件通常位于站点的根目录下,或者您可以将其放入包含所有javascript文件的文件夹中

然后在
js_handler.php
文件中,您可以进行某种检查。
最简单(但不安全)的选择是:

if ($header['Referer']=='mydomain.com'){
    //it was requested by loading the HTML page
} else {
    //it was requested directly
}
要获取
$header
请参阅。
一个更彻底的方法是使用随机生成的访问密钥并进行验证。您可以让cron作业每隔五分钟左右生成一个新密钥,然后使用SQL或将其写入文件。例如:

$file_path = //some path
$randKey = generateRandomKey();
$keyArray = json_decode(file_get_contents($file_path),true);
$keyArray[1] = $keyArray[0];//move the first element to the 2nd.
$keyArray[0] = $randKey; //set the first element to $randKey
file_put_contents($file_path,json_encode($keyArray) );
然后,当您交付一个HTML页面时(假设您是通过PHP进行的):


有关脚本的位置,请使用
$\u SERVER['REQUEST\u URI']
。您应该能够只
包含
javascript文件并让脚本终止。不过,您可能需要设置标题。我不完全确定,现在无法测试。

请求头很容易伪造(它们毕竟是由请求者创建的),因此如果限制访问非常重要的话,这不是一种简单的方法。仅供参考,我知道。我提到过,出于某种原因,我想不起“伪造”这个词。稍后我将改进我的答案,以涵盖更安全的路由。@Jakar.htaccess文件的作用是什么?我真的不知道这是什么意思。如果它将all.js重定向到js_handler.php,那么我怎么知道请求了哪个文件?@Nguyễ我更新了我的答案,希望能有所帮助。如果您有任何问题,我要到明天才能答复。我想在.htaccess文件中有问题。我将您的代码发送到domain.com/js/.htaccess该目录中有一个domain.com/js/js_handler.php尝试请求domain.com/js/foo.js=>500内部服务器错误这是我的.htaccess文件选项-重写基上的多视图重写引擎/RewriteCond%{request_FILENAME}-d#不是一个目录RewriteCond%{REQUEST_URI}^(+)\.js$RewriteRule^(+++$/js_handler.php[QSA]是的。我这样做是为了防止CSRF。如果是直接请求,则有点困难,它只显示location.assign(“foo.com”);
$file_path = //some path
$randKey = generateRandomKey();
$keyArray = json_decode(file_get_contents($file_path),true);
$keyArray[1] = $keyArray[0];//move the first element to the 2nd.
$keyArray[0] = $randKey; //set the first element to $randKey
file_put_contents($file_path,json_encode($keyArray) );
<?php
    $keyArray = json_decode(file_get_contents($file_path),true);
    $randKey = $keyArray[0]; 
?>
<head>
    <script type="text/javascript" 
            src="/path/to/myscript.js?secret=<?=$randKey?> ></script>
</head>
$keyArray = json_decode(file_get_contents($file_path),true);
if (in_array($_GET['secret'],$keyArray){
    //deliver the js file
} else {
    //deliver 404 page
}