localhost Apache2上的Drupal 7中的AJAX URL请求不包括基本URL或基本路径

时间:2013-05-12 15:24:28

标签: javascript ajax drupal mod-rewrite drupal-7

我目前在本地Drupal 7环境中遇到问题。由于Drupal 7站点配置变得非常复杂,我将尝试尽可能详细地解释我的问题。

该站点位于我本地环境的子文件夹中,我有更多项目在我的localhost上运行,所以最好我希望将项目分开。另外,对于这个站点,我有两个单独的文件夹,一个用于开发,一个用于生产,共享相同的数据库,所以我想这里添加假域的解决方案不起作用(如果我错了,请纠正我)。

所以主要的问题似乎是AJAX请求不包含基本URL或基本路径,我无法登录http://localhost/mysite/devel/docroot/user,因为AJAX请求将转到http://localhost/system/ajax或{{ 1}}因此不会返回正确的JSON响应。

如何解决这个问题? Apache的http://localhost/ajax_register/login/ajaxhttpd.conf中的配置是否足以使其工作?

这是我到目前为止所做的,首先是.htaccess

settings.php

接下来,我在$base_url = 'http://localhost/mysite/devel/docroot'; $base_path = '/mysite/devel/docroot/'; 中尝试了以下重写规则:

httpd.conf

在这里,我在响应文本中弹出了以下HTML(似乎来自<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{HTTP_REFERER} .*devel.*$ [OR] RewriteRule ^/sites/(.*)$ /mysite/devel/docroot/sites/$1 RewriteRule ^/system/(.*)$ /mysite/devel/docroot/system/$1 RewriteRule ^/ajax_register/(.*)$ /mysite/devel/docroot/ajax_register/$1 </IfModule> )而不是预期的JSON响应:

index.php

然后没有重写规则,而是在An AJAX HTTP error occurred. HTTP Result Code: 404 Debugging information follows. Path: http://localhost/ajax_register/login/ajax StatusText: error ResponseText: lots of HTML... 中使用代理:

httpd.conf

对于代理指令,POST AJAX请求给出了类似的404 not found错误,但现在响应文本是JSON格式。

<IfModule mod_proxy.c>

    ProxyRequests Off
    ProxyPreserveHost On

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>

    RewriteEngine on

    ProxyPass /system/ http://localhost/mysite/devel/docroot/system/
    ProxyPassReverse /system/ http://localhost/mysite/devel/docroot/system/
    <Location /system/>
        Order allow,deny
        Allow from all
    </Location>

    ProxyPass /ajax_register/ http://localhost/mysite/devel/docroot/ajax_register/
    ProxyPassReverse /ajax_register/ http://localhost/mysite/devel/docroot/ajax_register/
    <Location /ajax_register/>
        Order allow,deny
        Allow from all
    </Location>

</IfModule>

如果没有重写规则和代理指令,我会在JavaScript弹出窗口中收到以下错误:

An AJAX HTTP error occurred.
HTTP Result Code: 404
Debugging information follows.
Path: http://localhost/ajax_register/login/ajax
StatusText: error
ResponseText: some JSON code...

最后在An AJAX HTTP error occurred. HTTP Result Code: 404 Debugging information follows. Path: http://localhost/ajax_register/login/ajax StatusText: error ResponseText: 404 Not Found Not Found The requested URL /ajax_register/login/ajax was not found on this server. 我尝试将基础重写为以下内容:

.htaccess

并且在这里我得到了与RewriteBase /mysite/devel/docroot/ 中注释掉重写规则和代理指令的情况相同的404错误。我还想在数据库中添加httpd.conf表格,我已将英语的域名设置为languages

我不明白,为什么基础不包含在AJAX URL请求的前面?我该如何添加它?当我在Firebug中查询localhost时,我确实得到了我在Drupal.settings.basePath中设置的值:S - 有人有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您的问题有很多解决方案,但我会尝试专注于最成熟的问题。我假设您使用的是Windows环境。

你说你在localhost上运行你的项目,这是你的第一个错误。

Localhost只是您指定的一种奇怪的域名形式。当您请求“www.google.com”或“localhost”等域时,会执行以下步骤:

  1. 浏览器检查所请求域的特定文件。此文件名为hosts file
  2. 如果在hosts文件中找到域名,浏览器会向hosts文件中指定的IP地址发送请求
  3. 如果在hosts文件中找不到域名,浏览器将查询返回相应IP地址的域名服务器。
  4. 现在localhost只是你的hosts文件中指定的域名,它指向环回地址。(127.0.0.1)。

    因此,这里的神奇技巧是将您的自定义主机(如“project1”,“project2”等)绑定到该环回地址(127.0.0.1)。

    当您在浏览器中向“project1”发送请求时,在端口80上运行的服务器将响应,就像您键入“localhost”一样。

    您需要处理的第二部分称为virtual hosts。当您发送具有特定域名的请求时,您的http请求中会包含一个名为“Host”的特殊标头。

    让我们假设您将所有这些自定义域重定向到相同的IP(127.0.0.1)。为了让apache服务于不同的项目,您应该指示apache查看“Host”标题并为相应的项目解析它。

    再次通过设置virtual hosts来实现这一点。

    PHP中的许多框架和内容管理系统都有一些丑陋的方式来插入一些神奇的“$ BASE_PATH”变量,这是一种不好的做法,因为可以通过纯html和正确配置的服务器中的相对路径来实现。< / p>