Dot-Htaccess

htaccess 僅在根目錄中重寫(一般)

  • March 23, 2022

嗨,我試圖讓 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標誌不是必需的。第一條規則中的擷取組也不是必需的。替換字元串中的文字點不需要進行反斜杠轉義。

注意:這也將無法處理以斜杠結尾的請求。


但是,如果這些是您唯一與此相關的規則,那麼您 不需要兩個規則,只需要一個,前提是對文件根本身的請求沒有varURL 參數是可以的。例如:

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=.

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