放置 <If> 指令後來自 RewriteRule 的錯誤請求
當我偶然發現這個問題時,我正在為 localhost 和 godaddy 建構 .htaccess。
RewriteEngine on SetEnvIf HOST ^localhost$ LOCAL=/company SetEnvIf HOST ^((?!localhost).)+ LOCAL=/ <If "%{ENV:LOCAL} == '/'"> RewriteRule (.+) index.php?test=godaddy [QSA,L] </If> <Else> RewriteRule (.+) index.php?test=localhost [QSA,L] </Else>
我曾嘗試尋找諸如添加 ifmodule mod_rewrite 之類的答案,並嘗試封裝 if 指令但無濟於事,並想知道為什麼這不起作用。
我確實發現,如果您在 index.php 之前放置 / ,它將返回 localhost 的儀表板,而對於 godaddy,它將返回內部伺服器錯誤。
在
<If>
表達式中使用 mod_rewrite 指令似乎很“錯誤” 1無疑與處理指令的後期*階段有關。(*1我不確定它是真的“錯誤”還是“設計”,但它肯定是無證的、奇特的和無用的!)
在
<If>
塊內,RewriteRule
模式(即(.+)
)與請求映射到的完整絕對文件系統路徑匹配,而不是相對(或根相對)URL 路徑2。相對路徑替換*(不以斜線或方案開頭)與什麼相關?!在測試表達式內的相對路徑替換上添加回的*(目錄?)前綴*<If>
是文字文本*If/
- 這很奇怪。這與上下文(.htaccess
、目錄、虛擬主機或伺服器)無關。(*2 這已被報告為錯誤,儘管我不確定是否真的如此。我想我看到的錯誤報告比我連結到的更詳細/討論的錯誤報告,但我不能好像找到了?)
因此,在您的情況下,“錯誤請求”是內部重寫為
*If/index.php?test=...
.我確實發現,如果你
/
在index.php
它返回到 localhost 和 godaddy 的儀表板之前添加一個,它將返回一個內部伺服器錯誤。斜杠前綴將導致文件根相對 URL 路徑。
我希望這會導致內部重寫循環(即 500 內部伺服器錯誤響應),因為重寫引擎在請求最初重寫後重新啟動,並且沒有什麼可以防止這種情況重複發生。不知道為什麼 localhost 和 GoDaddy 之間的行為存在差異,除非它可能與您可能擁有的其他指令互動?
所以,如果可能的話,我會避免在
<If>
表達式中使用 mod_rewrite 指令。(在這個有限的例子中,這個<If>
表達式當然是不必要的。)但是,有更好的方法來解決這個問題。
大概在“localhost”上,您可以訪問伺服器配置/虛擬主機?
Define
在這種情況下, Apache 參數/變數會更容易。例如:# In <VirtualHost> on local development server Define LOCAL 1
然後在
.htaccess
:RewriteEngine on # Local Development Server <IfDefine LOCAL> RewriteCond %{QUERY_STRING} !^test RewriteRule (.+) index.php?test=localhost [QSA,L] </IfDefine> # Live Server <IfDefine !LOCAL> RewriteCond %{QUERY_STRING} !^test RewriteRule (.+) index.php?test=godaddy [QSA,L] </IfDefine>
*另外:*上述指令中的擷取
RewriteRule
模式完全是多餘的。另請參閱我對 StackOverflow 上相關問題的回答
<If>
,該問題突出了在 Apache表達式中使用 mod_rewrite 的其他問題: