Mod-Rewrite

在 httpd.conf 中忽略了 RewriteCond

  • October 29, 2018

簡單地說,這在 htaccess 中有效:

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 

RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301] 

但是當我將它移到 httpd.conf 時,它什麼也不做。我已經在directory指令中嘗試過,這也沒有什麼區別。

作為測試,httpd.conf 中的以下內容確實會產生影響,它會重定向,但會重定向到所有頁面,即忽略該條件。

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 

RewriteRule ^(.*)$ https://example.net?u=$1 [L,NC,R=301] 
RewriteRule ^([^/]+)/?$ https://example.net?u=$1 [L,NC,R=301] 

但是當我將它移到 httpd.conf 時,它什麼也不做。

因為在伺服器上下文中,RewriteRule 模式永遠不會匹配。在伺服器上下文中,URL 路徑是相對於根的,以斜杠開頭。在.htaccessURL 路徑中,目錄前綴較少,因此永遠不要以斜杠開頭。

我已經在目錄指令中嘗試過,這也沒有什麼區別。

如果您包含正確的目錄路徑,那應該可以工作。(並重新啟動 Apache。)但是,如果您仍然有一個.htaccess啟用重寫引擎的文件,那麼這將覆蓋<Directory>容器中的伺服器指令,因此這些<Directory>指令不會做任何事情。

作為測試,httpd.conf 中的以下內容確實會產生影響,它會重定向,但會重定向到所有頁面,即忽略該條件。

RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f 
:

因為在伺服器上下文中,請求還沒有映射到文件系統,所以SCRIPT_FILENAME(or REQUEST_FILENAME) 還不包含完整的文件系統路徑(它只包含 URL 路徑),所以這個條件總是評估為真(“URL-正在測試的路徑”不是物理文件 - 這可能是正確的)。

您需要使用前瞻來確定最終值。IE。%{LA-U:REQUEST_FILENAME}.

因此,在伺服器(或虛擬主機)上下文中,您需要使用以下內容:

RewriteEngine on

RewriteCond %{LA-U:REQUEST_FILENAME} !-f 
RewriteCond %{LA-U:REQUEST_FILENAME} !-d 

RewriteRule ^/([^/]+)/?$ https://example.net?u=$1 [L,R=301] 

RewriteRule 注意模式上的斜線前綴。

NC國旗在這裡是多餘的。

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