Dot-Htaccess

.htaccess - 模擬虛擬主機錯誤連結到目錄列表中的父目錄

  • October 22, 2013

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 和目前目錄來評估“父目錄”連結。

我猜您使用/htdocsdirectory 作為 .dev 域和所有其他 .dev 域的文件根目錄folder1.devfolder2.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:

  1. 我們有http://folder.dev/folder/.
  2. 我們看到“文件夾”(子域)==“文件夾”(第一個路徑元素)。
  3. 重定向到http://folder.dev/.

但是,如果您這樣做,將無法訪問類似 的路徑/htdocs/folder/folder/,其中第一個路徑元素確實與子域名相同。

鑑於此,僅使用 .htaccess 和 mod_rewrite 無法解決此問題。

另一個解決方案:

  1. 對您想要訪問的任何文件夾使用虛擬主機。不需要 .htaccess 魔法。虛擬主機配置可以從文件夾列表中生成。最靈活的解決方案,因為可以使用任何配置選項為任何文件夾創建任何虛擬主機,無論它們在哪裡。
  2. 使用mod_vhost_alias。更簡單,不需要腳本技能,但可能需要更改文件夾命名以在 folder_name 和 document_root 之間進行自動轉換。
  3. 使用.htaccess 中的HeaderName將標題添加到所有索引頁面。使用 jQuery 以您希望的任何方式更改父目錄連結。看起來像一個骯髒的黑客,但會工作。

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