我目前在本地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/ajax
或httpd.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 - 有人有任何想法吗?
答案 0 :(得分:0)
您的问题有很多解决方案,但我会尝试专注于最成熟的问题。我假设您使用的是Windows环境。
你说你在localhost上运行你的项目,这是你的第一个错误。
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和正确配置的服务器中的相对路径来实现。< / p>