如何制定相對於 .htaccess 檔案的重寫規則

如何制定相對於 .htaccess 檔案的重寫規則

目前我有一個像這樣的 .htaccess 檔案。

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^/(always|rewrite|these|dirs)/ [NC]

RewriteRule ^(.*)$ router.php [L,QSA]

當網站檔案位於網頁伺服器的 document_root 中時(即domain.com/abc.php-> <DOCUMENT_ROOT>/abc.php),它可以建立。但在我們目前的設定(不可更改)中,這一點並不能保證。有時我們可以在文檔根目錄和 .htaccess 檔案的資料夾之間有任意資料夾(即domain.com/something/abc.php-> <DOCUMENT_ROOT>/something/abc.php)。唯一的問題是第二個RewriteCond不再運作。無論如何,是否可以透過相對於.htaccess檔案的路徑動態檢查存取的路徑。

例如:

如果我有一個網站,文件domain.com/prefix/的目錄在哪裡.htaccess

NOT FORCED TO REWRITE -> domain.com/prefix/index.php
FORCED TO REWRITE -> domain.com/prefix/rewrite/index.php

如果我有一個網站,文件domain.com/的目錄在哪裡.htaccess

NOT FORCED TO REWRITE -> domain.com/index.php
FORCED TO REWRITE -> domain.com/rewrite/index.php

答案1

有一個解決方案,但並不簡單。

使用RewriteMap

我會這樣做:

創建一個重寫映射文件。看此處了解更多信息。這是一個非常簡單的文字文件,其中包含:首先,錯誤的 URL沒有“/”, 然後一個空間(至少)然後是正確的網址,如下所示:

ok​ /folder1/
ok /folder2/
ok /folder3/

然後是代碼:

RewriteMap myfoldermap \
  dbm:/web/htdocs/yourwebsite.com/rewriterules/myfoldermap.map

RewriteCond %{REQUEST_URI} ^/([^/]+)/(.*)
# Now in '%1' there's the name of the folder
# Don't touch the URL but...
# ...check if it exists in the map file
RewriteRule (.*) - [QSA,E=FOLDERMAP:${myfoldermap:%1|notfound}]

# if the environment is neither empty or not found...
RewriteCond %{E:FOLDERMAP} !^(notfound|)$
# this means we found something...
# => apply the RewriteRule
RewriteRule ^(.*)$ router.php [L,QSA]

如果它不起作用:閱讀我通常的“兩個提示”,並在您的問題中添加重寫日誌。

兩個提示:

如果您不在託管環境中(=如果它是您自己的伺服器並且您可以修改虛擬主機,而不僅僅是文件.htaccess),請嘗試使用該RewriteLog指令:它可以幫助您追蹤此類問題:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜歡的檢查正規表示式的工具:

http://www.quanetic.com/Regex(不要忘記選擇 ereg(POSIX) 而不是 preg(PCRE)!)

答案2

被迫重寫意味著即使請求的檔案或目錄存在,重寫規則也應該起作用?

如果是,請盡量避免建立檔案/目錄。

或將其分為兩個規則:

RewriteRule ^/(always|rewrite|這些|dirs)/ router.php [L]

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ router.php [L,QSA]

答案3

如果我理解正確的話(特別是我不知道你的意思被迫重寫),RewriteBase是給你的。

順便一提:不要使用類似的東西域名.com:-)

相關內容