Apache-2.2

帶別名的 Apache 虛擬主機

  • January 7, 2012

我有一個虛擬主機在我的本地 Apache 副本上執行。它有一個別名。

<VirtualHost 127.0.0.1>
       ServerName oliverash.me.dev
       DocumentRoot "/usr/docs/oliverash.me/public"
       Alias /mayor "/usr/docs/uni/tmosct/public"
</VirtualHost>

這工作正常。我可以通過oliverash.me.dev/mayor瀏覽器訪問別名。但是,我.htaccess rewrite在該別名文件夾中有一個簡單的文件夾,它將所有內容(文件夾除外)重寫到 index.php 頁面。這個重寫工作正常。

雖然重寫工作正常,但重寫返回 404 Not Found 錯誤。例如,如果我轉到oliverash.me.dev/mayor/abcdefg,它會重寫index.php文件,但我收到此錯誤:

“在此伺服器上找不到請求的 URL /usr/docs/uni/tmosct/public/index.php。”

這個文件確實存在。我可以直接訪問它。

當我使用相同的別名而localhost不是這個虛擬主機時,重寫工作正常,並且 index.php 返回實際文件,而不是 404。這讓我覺得這與我的權限有關虛擬主機。所以我試圖在我的下面添加這個httpd-vhosts.conf(沒有運氣):

<Directory "/usr/docs/oliverash.me/public">
       AllowOverride All
       Order allow,deny
       Allow from all
</Directory>

這些設置與localhost‘s上使用的設置相同DocumentRoot,所以我不明白為什麼它沒有幫助。

更新:

所以我檢查了 Apache error_log。事實證明,這個別名的重寫實際上是相對於這個虛擬主機的文件根目錄的。

[Fri Jan 06 22:30:57 2012] [error] [client 127.0.0.1] File does not exist: /usr/docs/oliverash.me.dev/usr

這個重寫實際上是在尋找/usr/docs/oliverash.me.dev/public/usr/docs/uni/tmosct/publicindex.php。希望很明顯它應該在/usr/docs/oliverash.me.dev.

更新 2:

好的,這是我遇到 Apache 的本地副本時遇到的問題。但是,我剛剛在我的實時 Web 伺服器上遇到了完全相同的別名問題。這不使用任何類型的虛擬主機。

[Sat Jan 07 02:41:51 2012] [error] [client 86.11.223.135] File does not exist: /var/www/html/var

同樣,路徑是相對於 DocumentRoot 的。它應該是一個絕對路徑。

有點煩人:(

更新 3:

這正是我遇到的問題,但也許措辭更好:http ://forums.devshed.com/apache-development-15/rewritebase-alias-and-rewriterule-are-not-rooting-to-required-file -395917.html

解決方案:RewriteBase 必須與 Alias 定義相同,而不是文件系統中的物理路徑/目錄!

檢查RewriteBasemod_rewrite 的指令,聽起來可能與此有關。閱讀:http ://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase

編輯1

為了試試這個,我在VMware中設置了一個全新的Ubuntu,一個乾淨的apache2安裝並在正常路徑之外創建了一個新文件夾,然後設置了一個.htaccess,我讓它按照正確的RewriteBase規則工作。預設的 DocumentRoot 是 /var/www,我在其中放了一個 index.php 只是為了告訴我我在哪裡。它呼應了“我預設是 index.php!”。然後我在 Apaches 配置中創建了這個別名:

Alias /testberg /home/www/testberg
<Directory "/home/www/testberg">
   Options +Indexes
   AllowOverride All
</Directory>

在那裡我放了另一個 index.php 說“我是 testberg 中的 index.php!”。在 /home/www/testberg 下,我創建了一個包含以下內容的 .htaccess:

RewriteEngine On
RewriteBase /testberg
RewriteRule ^apa.test$ index.php

當我瀏覽到http://192.168.100.183/testberg/apa.test我現在看到:“我是 testberg 中的 index.php!” 並且 Apaches 日誌文件等中沒有錯誤。

這不是你想要完成的嗎?

編輯 2

嘗試使用不同的虛擬主機。在我的 Windows 桌面上,我將 ahntest.net 指向我的 VMware IP in c:\windows\system32\drivers\etc\hosts. 在我的 VMware 伺服器上,我創建/home/www/ahntest.net並放置了一個修改後的 index.php,以回顯“我是 ahntest.net 中的 index.php!” 並創建了以下虛擬主機:

<VirtualHost *:80>
   ServerAdmin webmaster@localhost
   ServerName ahntest.net
   DocumentRoot /home/www/ahntest.net

   Alias /testberg /home/www/testberg
   <Directory "/home/www/testberg">
       Options +Indexes
       AllowOverride All
   </Directory>
</VirtualHost>

瀏覽到http://ahntest.net給我“我是 ahntest.net 中的 index.php!”,瀏覽到http://ahntest.net/testberg給我“我是 testberg 中的 index.php!” 最後瀏覽到http://ahntest.net/testberg/apa.test給了我“我是 testberg 中的 index.php!” 所以據我所知,它在這裡也可以正常工作。編輯 2 中的 .htaccess/patch 與上面的編輯 1 相同。

引用自:https://serverfault.com/questions/347476