0

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

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

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

如何解决?Apache 中的配置是否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 响应中得到了以下带有 HTML(似乎来自 )的弹出窗口:

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 请求给出了类似的 404 not 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/

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

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

4

1 回答 1

0

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

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

本地主机不过是您指定的一种奇怪的域名。当您请求“www.google.com”或“localhost”之类的域时,会发生以下步骤:

  1. 浏览器检查请求域的特定文件。这个文件叫做hosts文件
  2. 如果在hosts文件中找到域名,浏览器会向hosts文件中指定的IP地址发送请求
  3. 如果在 hosts 文件中没有找到域名,浏览器会查询返回相应 IP 地址的域名服务器。

现在 localhost 只不过是在您的主机文件中指定的域名,它指向环回地址。(127.0.0.1)。

所以这里的魔术是将您的自定义主机(如“project1”、“project2”等)绑定到该环回地址(127.0.0.1)。

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

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

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

同样,您可以通过设置virtual hosts来做到这一点。

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

于 2013-05-12T17:04:56.243 回答