Dot-Htaccess

放置 <If> 指令後來自 RewriteRule 的錯誤請求

  • February 20, 2021

當我偶然發現這個問題時,我正在為 localhost 和 godaddy 建構 .htaccess。

RewriteEngine on

SetEnvIf HOST ^localhost$ LOCAL=/company
SetEnvIf HOST ^((?!localhost).)+ LOCAL=/

&lt;If "%{ENV:LOCAL} == '/'"&gt;
   RewriteRule (.+) index.php?test=godaddy [QSA,L]
&lt;/If&gt;
&lt;Else&gt;
   RewriteRule (.+) index.php?test=localhost [QSA,L]
&lt;/Else&gt;

我曾嘗試尋找諸如添加 ifmodule mod_rewrite 之類的答案,並嘗試封裝 if 指令但無濟於事,並想知道為什麼這不起作用。

我確實發現,如果您在 index.php 之前放置 / ,它將返回 localhost 的儀表板,而對於 godaddy,它將返回內部伺服器錯誤。

&lt;If&gt;表達式中使用 mod_rewrite 指令似乎很“錯誤” 1無疑與處理指令的後期*階段有關。

(*1我不確定它是真的“錯誤”還是“設計”,但它肯定是無證的、奇特的和無用的!)

&lt;If&gt;塊內,RewriteRule 模式(即(.+))與請求映射到的完整絕對文件系統路徑匹配,而不是相對(或根相對)URL 路徑2。相對路徑替換*(不以斜線或方案開頭)與什麼相關?!在測試表達式內的相對路徑替換上添加回的*(目錄?)前綴*&lt;If&gt;是文字文本*If/- 這很奇怪。這與上下文.htaccess目錄虛擬主機伺服器)無關。

(*2 這已被報告為錯誤,儘管我不確定是否真的如此。我想我看到的錯誤報告比我連結到的更詳細/討論的錯誤報告,但我不能好像找到了?)

因此,在您的情況下,“錯誤請求”是內部重寫為*If/index.php?test=....

我確實發現,如果你/index.php它返回到 localhost 和 godaddy 的儀表板之前添加一個,它將返回一個內部伺服器錯誤。

斜杠前綴將導致文件根相對 URL 路徑。

希望這會導致內部重寫循環(即 500 內部伺服器錯誤響應),因為重寫引擎在請求最初重寫後重新啟動,並且沒有什麼可以防止這種情況重複發生。不知道為什麼 localhost 和 GoDaddy 之間的行為存在差異,除非它可能與您可能擁有的其他指令互動?

所以,如果可能的話,我會避免在&lt;If&gt;表達式中使用 mod_rewrite 指令。(在這個有限的例子中,這個&lt;If&gt;表達式當然是不必要的。)

但是,有更好的方法來解決這個問題。

大概在“localhost”上,您可以訪問伺服器配置/虛擬主機?Define在這種情況下, Apache 參數/變數會更容易。例如:

# In &lt;VirtualHost&gt; on local development server
Define LOCAL 1

然後在.htaccess

RewriteEngine on

# Local Development Server
&lt;IfDefine LOCAL&gt;
   RewriteCond %{QUERY_STRING} !^test
   RewriteRule (.+) index.php?test=localhost [QSA,L]
&lt;/IfDefine&gt;

# Live Server
&lt;IfDefine !LOCAL&gt;
   RewriteCond %{QUERY_STRING} !^test
   RewriteRule (.+) index.php?test=godaddy [QSA,L]
&lt;/IfDefine&gt;

*另外:*上述指令中的擷取RewriteRule 模式完全是多餘的。


另請參閱我對 StackOverflow 上相關問題的回答&lt;If&gt;,該問題突出了在 Apache表達式中使用 mod_rewrite 的其他問題:

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