.htaccess - 模擬虛擬主機錯誤連結到目錄列表中的父目錄
http://folder.dev/subfolder/
我有一個專用於我的本地伺服器 (.dev) 的域,以及一個將請求重定向到.htaccess 的文件/htdocs/folder/subfolder
。它工作得很好,除了一個小問題。當我啟用目錄列表時,我可以正確訪問所有文件夾、子文件夾和文件,除非我點擊Parent Directory
連結,例如,該連結應該指向http://folder.dev
,但重定向到http://folder.dev/folder/
並因此拋出404 not found
。同樣,如果Parent Directory
應該連結到http://folder.dev/subfolder/
,它會連結到http://folder.dev/folder/subfolder/
。這是我的 .htaccess 的樣子:RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} !(/$|\.) RewriteRule (.*) %{REQUEST_URI}/ [R=301,L] RewriteCond %{ENV:REDIRECT_SUBDOMAIN} ="" RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9][-a-z0-9]+)\.dev\.?(:80)?$ [NC] RewriteCond %2 !^www|ftp|mail|pop3|localhost$ RewriteCond %{DOCUMENT_ROOT}/%2 -d RewriteRule ^(.*) %2/$1 [E=SUBDOMAIN:%2,L] RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN}]
除了那一件事,其他一切都很好(例如文件中的相對連結等)
發生這種情況是因為當 Apache 顯示目錄索引時,它會根據虛擬主機的 DocumentRoot 和目前目錄來評估“父目錄”連結。
我猜您使用
/htdocs
directory 作為 .dev 域和所有其他 .dev 域的文件根目錄folder1.dev
,folder2.dev
並且您將 .htaccess 放在/htdocs/.htaccess
.當您轉到
http://folder.dev/subfolder/
(文件根目錄為/htdocs/
)時,您的 .htaccess 會向您顯示/htdocs/folder/subfolder/
。從文件根目錄到該目錄的相對路徑是folder/subfolder
. 當 Apache 計算它目前顯示的目錄的父目錄連結時,它需要http://
++ ,folder.dev
也就是說dirname('folder/subfolder')
,當然等於http://folder.dev/folder/
,而不是http://folder.dev/
像您期望的那樣。如果域名後的第一個路徑元素等於子域並重定向到根,則可以簽入 .htaccess:
- 我們有
http://folder.dev/folder/
.- 我們看到“文件夾”(子域)==“文件夾”(第一個路徑元素)。
- 重定向到
http://folder.dev/
.但是,如果您這樣做,將無法訪問類似 的路徑
/htdocs/folder/folder/
,其中第一個路徑元素確實與子域名相同。鑑於此,僅使用 .htaccess 和 mod_rewrite 無法解決此問題。
另一個解決方案:
- 對您想要訪問的任何文件夾使用虛擬主機。不需要 .htaccess 魔法。虛擬主機配置可以從文件夾列表中生成。最靈活的解決方案,因為可以使用任何配置選項為任何文件夾創建任何虛擬主機,無論它們在哪裡。
- 使用mod_vhost_alias。更簡單,不需要腳本技能,但可能需要更改文件夾命名以在 folder_name 和 document_root 之間進行自動轉換。
- 使用.htaccess 中的HeaderName將標題添加到所有索引頁面。使用 jQuery 以您希望的任何方式更改父目錄連結。看起來像一個骯髒的黑客,但會工作。