使用環境變量完全可以,但是,您不需要自己手動設置此環境變量。 Apache提供了可用於此目的的REDIRECT_STATUS
環境變量。
REDIRECT_STATUS
在初始請求時爲空(或未設置)。它在第一次(成功)內部重寫時設置爲200
。或者在發生錯誤時使用其他一些HTTP狀態代碼(404
等)。
因此,而不是檢查REDIRECT_LOOP
是不1
,我們可以簡單地檢查REDIRECT_STATUS
是空的,以確保我們所測試的初始請求,而不是重寫的請求。例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^myscript\.php$/[R,L]
(請注意,這只是REDIRECT_STATUS
,有在請求開始沒有STATUS
變量)。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !myscript\.php
RewriteRule (.*) /test/myscript.php?p=$1 [L,E=LOOP:1]
旁白:的RewriteCond
指令檢查REQUEST_URI
在這裏沒有真正做任何事情。如果第一個條件是真的(即它不是文件),那麼這個條件也必須是真的。但是,可以通過包括第一個來優化。然後這將避免每請求(包括重寫的請求)的文件檢查。例如:
RewriteCond %{REQUEST_URI} !^/test/myscript\.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /test/myscript.php?p=$1 [L]
或者,您可以包括這個規則而不是停止處理前的預檢查(異常)當請求myscript.php
:
RewriteRule ^test/myscript\.php$ - [L]
但是,如果你這樣做,那麼上述規範重定向必須出現之前這些規則,否則它們將不會被處理。 (無論如何,首先將規範重定向放在首位通常是可取的。)
@StephenOstermiller這與另一個問題/答案類似。請參閱http://stackoverflow.com/a/15244599/1741542 – 2013-03-11 14:41:08
+1好的.--- – 2013-03-11 16:39:18