為什麼index.html.bak 優先於index.php (Apache)?

為什麼index.html.bak 優先於index.php (Apache)?

我在新的虛擬 Debian 11 安裝中偶然發現了一個奇怪的行為。在 user/public_html 下,我對頁面進行了一些更改,在某些時候我的瀏覽器開始下載索引檔案而不是渲染它。

我花了很長時間才意識到問題出在index.html.bak 檔案上。這是正在下載的文件,即使我的資料夾中有index.php。

我已經透過在 configs 和 .htaccess 中設定 DirectoryIndex 對此進行了測試,只要在 index.php 之前設定了 index.html,並且未設定 DirectoryIndex,我總是可以複製該問題。 Index.html.bak 始終在index.php 之前提供。如果index.php首先在DirectoryIndex中設置,那麼index.php將被正確提供。

奇怪的是,這只發生在 public_html 下,而不是在 /var/www 下

我無法在使用舊版 Apache 的舊 Debian 伺服器上複製此內容。

這是一個錯誤還是我可能有一些錯誤的配置?自從全新安裝以來,我幾乎沒有碰過任何配置。

阿帕契版本是 Server version: Apache/2.4.54 (Debian) Server built: 2022-06-09T04:26:43

答案1

阿帕契模組mod_mime

請檢查您的 Apachemod_mime設定和Apache 2.4mod_mime文檔。特別是您的MultiviewsMatch指令設定和相關文件

請注意以下摘錄自同一內容的警告:允許Any要匹配的擴展名,即使mod_mime無法識別該擴展名”可以引起“不可預測的結果,例如網站管理員從未預料到的服務.old或文件。”.bak

阿帕契模組mod_mime
此模組用於將內容元資料指派給為 HTTP 回應選擇的內容透過將 URI 或檔案名稱中的模式對應到元資料值。例如,內容檔案的檔案副檔名通常定義內容的網路媒體類型、語言、字元集和內容編碼。這些資訊在包含該內容的 HTTP 訊息中傳送,並在選擇替代方案時用於內容協商,以便在選擇要提供的多個可能內容之一時尊重使用者的偏好。看mod_negotiation欲了解更多信息內容協商

具有多個副檔名的文件

文件可以有多個擴展名;擴展的順序是通常情況下無關緊要。例如,如果文件歡迎.html.fr映射到內容類型 text/html 和語言 French 然後是文件歡迎.fr.html將映射到完全相同的資訊。

如果您希望僅將檔案名稱的最後一個點分隔部分對應到特定的元數據,則不要使用添加指令。

MultiviewsMatch指示

// apache.org > 2.4 > mod_mime > 多視圖匹配

MultiviewsMatch允許三種不同的行為mod_negotiation的多視圖功能:Any   NegotiatedOnly   Filters|Handlers [處理程序|過濾器]

多視圖允許對檔案的請求,例如index.html,符合基本請求之後的任何協商的副檔名,例如index.html.en,,index.html.frindex.html.gz

NegotiatedOnly選項規定,基本名稱後面的每個擴充功能必須與mod_mime內容協商的公認擴充相關聯,例如字元集、內容類型、語言或編碼。這是最嚴格的實現,具有最少的意外副作用,並且是預設行為。
 

若要包含與Handlers和/或關聯的擴展Filters,請將MultiviewsMatch指令設定為處理程序、過濾器或這兩個選項關鍵字。

您最終可以允許Any擴展名匹配,即使mod_mime無法識別該擴展名。這可能會導致不可預測的結果,例如提供網站管理員從未期望提供的服務.old或文件。.bak

答案2

感謝用戶盲點的答案我能夠解決這個謎團(至少大部分)並實現合適的配置。

我所有原始問題的答案:

如果DirectoryIndexindex.html在index.php之前排序,Apache將首先優先考慮index.html,然後是index.html的替代版本(例如index.html.bak),如果index.php不存在,則在服務index.php之前。

在我的 Apache mods-enabled/userdir.conf 中,Options MultiViews已預設設定。此選項允許使用MultiviewsMatch指令,該指令可以提供替代文件,例如 foo.html.fr。

在我的 Apache 主配置 apache2.conf 中,Options MultiViews預設未啟用 /var/www 選項,因此這就是為什麼相關行為僅發生在使用者的 public_html 網站下。

我不知道為什麼這兩個的預設設定不同。

對於 .bak 文件,mime 類型application/x-trash在 Debian 中預設。這就是瀏覽器下載 .html.bak 檔案而不是渲染它們的原因。

我在基於 Debian 的系統上的 Apache 中註意到的內容與 Apache 文件之間存在一些不一致:

Apache 文件 mod_mime.html#multiviewsmatch

您最終可以允許任何擴展名匹配,即使 mod_mime 無法識別該擴展名。這可能會導致不可預測的結果,例如提供網站管理員從未期望提供的 .old 或 .bak 檔案。

事實上,即使MultiviewsMatch NegotiatedOnly配置了,.old 和 .bak 檔案也會被提供。這些檔案副檔名application/x-trash在 Debian 上的 /etc/mime.types 中分配了mime 類型。對我來說,這種行為沒有多大意義,而且也與文件相矛盾,所以在某種程度上這實際上是一個錯誤。

現在,如果您不想Multiviews完全停用,但想要停用某些已知檔案類型的服務,您可以使用 exampleRemoveType bak和 using從 mods-enabled/mime.conf 中的 apache 中刪除它們的 mime 類型MultiviewsMatch NegotiatedOnly

相關內容