首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地主机Apache2上的Drupal7中的AJAX URL请求不包括基URL或基路径

问本地主机Apache2上的Drupal7中的AJAX URL请求不包括基URL或基路径
EN

Stack Overflow用户
提问于 2013-05-12 23:24:28
回答 1查看 2K关注 0票数 0

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

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

因此,主要问题似乎是AJAX请求不包括基URL或基路径,我不能登录http://localhost/mysite/devel/docroot/user,因为AJAX请求将转到http://localhost/system/ajax或http://localhost/ajax_register/login/ajax,因此不会返回正确的JSON响应。

如何解决这个问题呢?阿帕奇的httpd.conf或.htaccess中的配置足以让它工作吗?

下面是我到目前为止所做的,首先是在settings.php中

代码语言:javascript
复制
$base_url = 'http://localhost/mysite/devel/docroot';
$base_path = '/mysite/devel/docroot/';

接下来,我尝试在httpd.conf中使用重写规则执行以下操作

代码语言:javascript
复制
<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>

在这里,我在响应文本中看到了以下弹出的超文本标记语言(似乎来自index.php),而不是预期的JSON响应:

代码语言:javascript
复制
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中使用代理

代码语言:javascript
复制
<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>

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

代码语言: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...

在没有重写规则和代理指令的情况下,我在JavaScript弹出窗口中得到以下错误:

代码语言:javascript
复制
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中,我尝试将基本代码重写为以下代码:

代码语言:javascript
复制
RewriteBase /mysite/devel/docroot/

在这里,我得到了与在httpd.conf中注释掉重写规则和代理指令时相同的404错误。我还想在数据库中添加这一点,在表languages中,我已经将英语的域设置为localhost。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-13 01:04:56

你的问题有很多解决方案,但我会试着专注于最成熟的一个。我假设你正在使用windows作为你的环境。

你说你在本地主机上运行你的项目,这是你的第一个错误。

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

  1. 浏览器检查请求的域的特定文件。此文件名为hosts file
  2. If如果域名在hosts文件中找到,浏览器将请求发送到hosts文件中指定的IP地址
  3. 如果在hosts文件中找不到该域名,浏览器将查询返回相应IP地址的域名服务器。

现在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的相对路径和正确配置的服务器来实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16508879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档