2

我的网站分为 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 根目录更深的目录中访问这些脚本?我希望保持一定的隐私和对我的脚本的控制。

4

2 回答 2

1

我可能误解了这个问题,所以我在这里有三个不同的答案。第一个与您使用的“域”一词有关。如果您使用 http 访问公共内容,使用 https 访问私有内容,您最好的选择可能是不要尝试。浏览器对于让 AJAX 代码访问主网页加载方法之外的内容变得非常挑剔。对于我自己的网站项目,我决定将所有内容移至 https 模式,并在通过 http 访问的目录中只留下两个文件:“favicon.ico”的副本和新的“index.html”,其中包含以下内容:

 <!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');">
 &nbsp;<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 文件的副本,并且您会希望两个 .ini 文件中的 open_basedir 设置相同。

最后一个答案:使用 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);

--无论调用task1.php的.html文件位于何处,这都是正确的

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"
于 2014-03-21T12:25:24.667 回答
1

你得到什么错误信息?(检查控制台)。浏览器会告诉您问题是否是跨源的。您可能需要在服务器上为该路径设置别名。我认为 Ajax 不会让您在不使用“file:///” uri 方案的情况下进入根目录之下。我不知道文件uri方案是否可以在Ajax中使用。别名肯定会起作用。这是在您的 httpd.conf 文件中完成的

于 2012-09-01T04:31:32.197 回答