我的网站分为public_html目录和包含所有PHP脚本的私有/ home目录。
我正在尝试利用jQuery的.ajax请求来访问我的public_html目录之外的PHP脚本,但是我很难这样做。我知道AJAX请求不允许域外请求,但是有没有办法“说服”AJAX我的请求的合法性,因为它实际上是在我的域内?
我目前的代码:
$.ajax({
type: "GET",
url: "/path/to/script",
success: function(resp){
alert(resp);
},
error: function(){
alert('%$!@');
}
});
如何能够在比我的www根目录更深入的目录中访问这些脚本?我希望保持对我的脚本的某些隐私和控制。
答案 0 :(得分:1)
您收到了什么错误消息? (检查控制台)。浏览器会告诉您问题是否来自原点。 您可能需要在服务器上为该路径设置别名。我不认为Ajax会让你在没有使用“file:///”uri方案的情况下超越root。我不知道文件uri方案是否可以在Ajax中使用。别名将确保工作。这可以在httpd.conf文件中完成
答案 1 :(得分:1)
我可能误解了这个问题,所以我在这里有三个不同的答案。首先 与您使用的“域名”有关。如果您使用http访问公共内容,并使用https访问私有内容,您最好的选择可能是不尝试。浏览器对于让AJAX代码访问加载主网页的方法之外的东西变得非常挑剔。对于我自己的网站项目,我决定将所有内容移到https模式,只留下通过http访问的目录中的两个文件:“favicon.ico”的副本和新的“index.html”,其中包含:< / p>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="Author" content="Me" />
<meta name="Copyright" content= "(C) by Me" />
<title>Switching to https mode ...</title>
</head>
<body onload="window.name='Redirect';window.open('https://www.mysite.com/index.html',
'Redirect');">
<h1><noscript><span style="color:#ff0000;">
This site requires JavaScript to work properly.</span></noscript></h1>
</body>
</html>
下一个答案。检查你的php.ini文件是如何设置“open_basedir”的。它需要是一个比目录树的主干更接近目录的目录,而不是您希望Web服务器出于任何目的访问的所有目录。请注意Apache设置为使用PHP的方式,它有时可能在其/ bin目录中有一个php.ini文件的副本,并且您希望open_basedir设置在两个.ini文件中都相同。
最后回答:人们需要非常小心地使用AJAX调用的.php文件中的相对路径 - 但首先让我们回顾一下这些简单的东西。我们假设你的基目录是:
/Base //(ignoring drive letter and any "baser" directories here)
并且在该目录中你有一些.html文件,它们也会在那个目录中调用一些.php文件。您可以在XMLHttpRequest对象的JavaScript代码中使用类似的内容访问它们,在其中一个.html文件中:
AJAXobj.open("GET", "./task1.php?URLdata=hi", true);
“./”指定“与此.html文件相同的目录”。同时,让我们假设您有一个子目录:
/Base/SubDir
并且在该目录中你有一些.html文件,它们将像以前一样在/ Base目录中调用相同的.php文件。对于子目录中的.html文件,您将需要稍微不同的JavaScript:
AJAXobj.open("GET", "../task1.php?URLdata=hi", true);
“../”指定“包含此.html文件的目录的父目录”。
现在是棘手的事情。假设,在task1.php文件中,您需要访问位于不同子目录中的一些数据:
/Base/DataDir
事实证明.html文件的位置可能决定了你需要在.php文件中指定的路径!更具体地说:
A)如果task1.php文件(在/ Base目录中)直接访问该另一个(/ DataDir)子目录中的文件,则需要这样的内容:
file("./DataDir/DatFile.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
- 无论.html文件位于何处,都会出现这种情况,调用task1.php
B)如果.php文件为文件创建一个字符串,并返回该字符串以进行AJAX处理(因为.html文件中的更多JavaScript代码将访问数据文件),那么PHP创建的字符串将取决于.html文件的位置:
"./DataDir/DatFile.txt"
对于/ Base目录中的任何.html文件,或
"../DataDir/DatFile.txt"
对于/ Base / SubDir中的任何.html文件
这里一个简单的解决方案可能是有两个非常相似的.php文件,比如task1a.php和task1b.php。但是,另一种可能性涉及指定绝对路径而不是相对路径:
"https://www.mysite.com/DataDir/DatFile.txt"