Mod-Rewrite
在 httpd.conf 中忽略了 RewriteCond
簡單地說,這在 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 路徑是相對於根的,以斜杠開頭。在.htaccess
URL 路徑中,目錄前綴較少,因此永遠不要以斜杠開頭。我已經在目錄指令中嘗試過,這也沒有什麼區別。
如果您包含正確的目錄路徑,那應該可以工作。(並重新啟動 Apache。)但是,如果您仍然有一個
.htaccess
啟用重寫引擎的文件,那麼這將覆蓋<Directory>
容器中的伺服器指令,因此這些<Directory>
指令不會做任何事情。作為測試,httpd.conf 中的以下內容確實會產生影響,它會重定向,但會重定向到所有頁面,即忽略該條件。
RewriteEngine on RewriteCond %{SCRIPT_FILENAME} !-f :
因為在伺服器上下文中,請求還沒有映射到文件系統,所以
SCRIPT_FILENAME
(orREQUEST_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
國旗在這裡是多餘的。