2013-05-12 64 views
0

我目前在本地Drupal 7環境中遇到問題。由於Drupal 7的網站配置可能會變得非常複雜,我會盡可能詳細地解釋我的問題。本地主機Apache2上的Drupal 7中的AJAX URL請求不包含基本URL或基本路徑

該網站坐落在我的本地環境中的一個子文件夾中,我有更多的項目在我的本地主機上運行,​​所以最好我想保持項目分離。另外,對於這個站點,我有兩個單獨的文件夾,一個用於開發,另一個用於共享相同數據庫的生產,所以通過添加虛假域的解決方案在這裏不起作用(我糾正我,如果我錯了)。

因此主要問題似乎是,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> 

在這裏,我得到了下面的彈出與HTML(似乎從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> 

對於代理的指令,被賦予了類似404未找到錯誤的POST AJAX請求,只是現在響應文本是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請求的前面?我該如何添加它?當我在Firebug中查詢Drupal.settings.basePath時,我確實得到了我在settings.php中設置的值:S - 有人有任何想法嗎?

回答

0

針對您的問題有很多解決方案,但我會嘗試專注於最成熟的解決方案。我假設你正在使用Windows作爲你的環境。

你說你在localhost上運行你的項目,這是你的第一個錯誤。

Localhost只不過是您指定的一個奇怪的域名形式。當您請求「www.google.com」或「localhost」這樣的域名時,會發生以下步驟:

  1. 瀏覽器檢查所請求域的特定文件。如果在hosts文件中找到該域名此文件被稱爲hosts file
  2. ,瀏覽器發送到主機指定的IP地址文件
  3. 如果在hosts文件中找不到域名,瀏覽器的請求查詢返回相應IP地址的域名服務器。

現在localhost只不過是您的主機文件中指定的域名,它指向環回地址(127.0.0.1)。

所以這裏的魔術就是把你的自定義主機如「project1」,「project2」等綁定到該回送地址(127.0.0.1)。

當您在瀏覽器中向「project1」發送請求時,運行在端口80上的服務器將如同鍵入「localhost」一樣作出響應。

你需要照顧的第二部分叫做virtual hosts。當您發送帶有特定域名的請求時,您的http請求中會包含一個名爲「主機」的特殊標頭。

讓我們假設您將所有這些自定義域重定向到相同的IP(127.0.0.1)。爲了使apache服務於不同的項目,你應該指示apache查看「主機」標題併爲相應的項目解析它。

再次通過設置virtual hosts來做到這一點。

很多PHP中的框架和內容管理系統都有一些醜陋的方法來插入一些神奇的「$ BASE_PATH」變量,這是一種不好的做法,因爲這可以通過純html和正確配置的服務器中的相對路徑來實現。

+0

解決,謝謝。學習如何正確配置服務器的基礎知識的開發人員的風險。 – 2013-05-12 19:24:19