我目前在本地的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中
$base_url = 'http://localhost/mysite/devel/docroot';
$base_path = '/mysite/devel/docroot/';接下来,我尝试在httpd.conf中使用重写规则执行以下操作
<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响应:
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中使用代理
<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格式。
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弹出窗口中得到以下错误:
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/在这里,我得到了与在httpd.conf中注释掉重写规则和代理指令时相同的404错误。我还想在数据库中添加这一点,在表languages中,我已经将英语的域设置为localhost。
我不明白,为什么不在AJAX URL请求前面包含base?我该如何添加它呢?当我在Firebug中查询Drupal.settings.basePath时,我确实得到了我在settings.php中设置的值:S -有人有什么想法吗?
发布于 2013-05-13 01:04:56
你的问题有很多解决方案,但我会试着专注于最成熟的一个。我假设你正在使用windows作为你的环境。
你说你在本地主机上运行你的项目,这是你的第一个错误。
Localhost只不过是您指定的一种奇怪的域名形式。当您请求"www.google.com“或"localhost”之类的域名时,会执行以下步骤:
现在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的相对路径和正确配置的服务器来实现。
https://stackoverflow.com/questions/16508879
复制相似问题