Php

.htaccess 文件重定向到錯誤的目的地

  • May 26, 2017

我有一個 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 做的事情相同,我懷疑是“獲勝”。當您請求/asdfasdf映射到文件基名時,然後MultiViews嘗試提供與預期 mime 類型匹配的適當文件(這可以解釋.js文件失去的原因)。

我對重寫規則集的理解是:1)如果請求的文件不存在,那麼 2)如果文件名不包含句點,則將請求重定向到

$$ filename $$.php

否則,您對 mod_rewrite 指令的理解非常正確,只是順序相反(首先處理RewriteRule 模式)……

  1. 如果 URL(即整個 URL)不包含句點。
  2. 並且該請求未映射到有效文件(如果您的所有文件都具有文件副檔名,則不太可能 - 所以這個條件可能會被省略)。
  3. .php通過附加擴展在內部重寫請求。
RewriteRule ^([^\.]+)$ $1.php [NC,L]

沒有必要在字元類中轉義文字句點,並且NC標誌在這裡是多餘的。

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