【问题标题】:AJAX url request to /home directory with jQuery使用 jQuery 对 /home 目录的 AJAX url 请求
【发布时间】:2012-08-26 19:47:04
【问题描述】:

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

【问题讨论】:

  • 您可以使用 AJAX 在公用文件夹之外调用脚本。路径是相对的 AFAIK,因此您使用 .. 向上移动一个目录
  • 我了解相对路径方法是 AJAX 的运行方式,但它似乎不适用于我的特定需求。我的目录结构如下:public_html/css/js/index.php resources/library/scripts/config.php 问题是我试图从public_html 目录访问scripts/ 目录。当我尝试相对路径方法时,“../../”的 jQuery url 只会返回 index.php url,即使我用更多子目录请求修改了 url...如何访问我之外的这些目录public_html?

标签: jquery ajax absolute-path


【解决方案1】:

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

【讨论】:

  • 我假设您使用的是 Apache。如果这不正确,您应该在您使用的服务器上使用别名进行谷歌搜索。如果您使用的是 Apache,这里有一些很好的信息:httpd.apache.org/docs/2.2/urlmapping.html。基本上,您所做的只是选择一条路径并在 public_html 范围内为其分配一个地址。如果您不熟悉 apache 的 conf 文件,它可能看起来令人生畏,但是一旦您掌握了语法,就很简单了。
【解决方案2】:

我可能误解了这个问题,所以我在这里有三个不同的答案。首先 与您使用的“域”一词有关。如果您使用 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2016-10-14
    • 2015-02-27
    相关资源
    最近更新 更多