Php
.htaccess 文件重定向到錯誤的目的地
我有一個 LAMP 堆棧。我正在使用以下 .htaccess 文件自動將請求映射到 .php 文件:
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L]
因此,如果我瀏覽到http://example.com/asdf,則會載入“asdf.php”文件。
但是,如果我創建一個具有相同名稱的 .css 文件(即“asdf.css”),那麼當瀏覽到沒有副檔名的名稱時,伺服器會返回 css 文件而不是 PHP 文件。.txt 文件副檔名似乎也會發生,並且可能任何其他三字元副檔名都會發生(儘管 .js 文件不會發生)。
我不明白為什麼會這樣。我對重寫規則集的理解是:1)如果請求的文件不存在,那麼 2)如果文件名不包含句點,則將請求重定向到
$$ filename $$.php 這怎麼可能返回 .txt 或 .css 文件,尤其是當匹配的 .php 文件存在時?我在這裡想念什麼?
謝謝!
如果您有多個具有相同基本名稱的文件,那麼聽起來您可能與
MultiViews
. 嘗試在您的.htaccess
文件(或伺服器配置)中禁用此功能:Options -MultiViews
MultiViews
(mod_negotiation 的一部分)與您嘗試使用 mod_rewrite 做的事情相同,我懷疑是“獲勝”。當您請求/asdf
並asdf
映射到文件基名時,然後MultiViews
嘗試提供與預期 mime 類型匹配的適當文件(這可以解釋.js
文件失去的原因)。我對重寫規則集的理解是:1)如果請求的文件不存在,那麼 2)如果文件名不包含句點,則將請求重定向到
$$ filename $$.php
否則,您對 mod_rewrite 指令的理解非常正確,只是順序相反(首先處理
RewriteRule
模式)……
- 如果 URL(即整個 URL)不包含句點。
- 並且該請求未映射到有效文件(如果您的所有文件都具有文件副檔名,則不太可能 - 所以這個條件可能會被省略)。
.php
通過附加擴展在內部重寫請求。RewriteRule ^([^\.]+)$ $1.php [NC,L]
沒有必要在字元類中轉義文字句點,並且
NC
標誌在這裡是多餘的。