帶別名的 Apache 虛擬主機
我有一個虛擬主機在我的本地 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/public
index.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 定義相同,而不是文件系統中的物理路徑/目錄!
檢查
RewriteBase
mod_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 相同。