Dot-Htaccess
htaccess 僅在根目錄中重寫(一般)
嗨,我試圖讓 htaccess 僅在不存在具有該名稱的文件、符號連結或目錄時重寫。我在這裡成功地做到了這一點:
RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+) - [PT,L] RewriteRule ^(.*)$ index\.php?var=$1 [QSA,L]
完美執行,但是,我只希望它發生在根目錄中,而不是任何子目錄中。如何以通用方式完成此操作(這意味著我不想在 .htaccess 文件中明確聲明 URL)?
為了防止針對文件根目錄之外的請求處理任何 mod_rewrite 指令,請將以下規則放在文件頂部:
# Prevent further processing if the request is outside the root directory RewriteRule / - [L]
上面基本上說明了對於任何請求的包含斜杠的 URL 路徑,然後在此處停止。(這也將擷取以斜杠結尾的請求 - 這是一個問題嗎?)
或者,您可以使現有兩條規則的正則表達式更加具體,使其僅適用於根目錄中的請求。
例如:
# Only apply rules to requests in the root directory RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^[^/]+$ - [L] RewriteRule ^([^/]*)$ index.php?var=$1 [QSA,L]
第一條規則上的
PT
標誌不是必需的。第一條規則中的擷取組也不是必需的。替換字元串中的文字點不需要進行反斜杠轉義。注意:這也將無法處理以斜杠結尾的請求。
但是,如果這些是您唯一與此相關的規則,那麼您 不需要兩個規則,只需要一個,前提是對文件根本身的請求沒有
var
URL 參數是可以的。例如:DirectoryIndex index.php RewriteCond %{REQUEST_FILENAME} !-s RewriteCond %{REQUEST_FILENAME} !-l RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]+)$ index.php?var=$1 [QSA,L]
請注意,條件的邏輯是相反的。
如前所述,對根目錄本身的請求將直接通過
index.php
(通過 mod_dir),而不是index.php?var=
.