簡體   English   中英

使用 REQUEST_URI 的 Htaccess 重定向 - 添加到 URL 的域文件夾

[英]Htaccess Redirection with REQUEST_URI - domain folders added to URL

在我們的共享托管服務器上,我們請求將客戶的域保留在他們的服務器上,但將負責 web 流量的 DNS 重定向到我們的服務器。

在我們的服務器上,我們必須在根目錄的.htaccess文件中添加一個條目,以將其指向服務器中的一個文件夾:

RewriteCond %{HTTP_HOST} ^(www\.)?example\.pl$ [NC]
RewriteCond %{REQUEST_FILENAME} !/WebsitesLive/Example/
RewriteRule ^(.*)$ /WebsitesLive/Example/$1 [L]

該網站運行良好,但我們在 Google Analytics 中注意到,有些人使用https://example.pl/WebsitesLive/Example訪問該網站。 我終於意識到(也許)是客戶端站點的htaccess文件中的 HTTPS 和非 www 重定向:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

在這種情況下, %{REQUEST_URI}是否真的會在重定向 URL 中包含WebsitesLive/Example

最重要的是,我該如何阻止它?

在這種情況下, %{REQUEST_URI}是否真的會在重定向 URL 中包含WebsitesLive/Example

是的,在從根目錄進行內部重寫之后, REQUEST_URI服務器變量被更新為包含完整的 URL 路徑。 您可以改為捕獲RewriteRule模式中的 URL 路徑,並使用相對於包含.htaccess文件的目錄的反向引用。

例如:

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

(您已經捕獲了 URL 路徑,但沒有使用它。)

通常,如果在子目錄中使用此規范重定向,並且該子目錄是可見 URL 的一部分,那么這是不正確的,因為它會從重定向的 URL中刪除子目錄。

或者,您可以在根.htaccess文件中實施規范重定向。

但是,雖然這應該可以防止文件系統目錄在規范重定向中公開,但這不會阻止用戶訪問該子目錄(從任何域)。 並且由於此子目錄已經公開(尤其是作為301 永久重定向),因此需要阻止對該子目錄的直接訪問或重定向回根目錄。 但是,這樣做時我們需要注意重定向循環。

您可以在子目錄.htaccess中使用類似以下內容將用戶的任何“直接”請求重定向回根目錄:

# /WebsitesLive/Example/.htaccess

# Redirect direct requests to subdirectory back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R=301,L]

REDIRECT_STATUS環境變量在直接請求時為空,但在第一次內部重寫后設置為 HTTP 狀態代碼 - 從而防止對子目錄的內部重寫被重定向回根目錄(無休止的重定向循環)。


在旁邊:

 RewriteCond %{HTTP_HOST} ^(www\.)?example\.pl$ [NC] RewriteCond %{REQUEST_FILENAME}./WebsitesLive/Example/ RewriteRule ^(.*)$ /WebsitesLive/Example/$1 [L]

雖然這可能“有效”,但第二個條件過於寬泛,因為它正在檢查/WebsitesLive/Example/是否出現在“文件系統路徑”中的任何位置。 而您應該檢查/WebsitesLive/Example/是否出現在 URL 路徑的“開始”處。 換句話說,它應該是這樣的:

:
RewriteCond %{REQUEST_URI} !^/WebsitesLive/Example/
:

請注意,只有在包含 mod_rewrite 指令的子目錄(被重寫到)中沒有.htaccess文件時,才需要此條件(以防止重寫循環)。 (因為子目錄中的 mod_rewrite 指令完全覆蓋父目錄 - 默認情況下。)

如果子目錄中沒有.htaccess文件,那么您顯然需要阻止直接訪問根.htaccess文件中的該子目錄,但所需規則與上述規則略有不同。 例如:

# /.htaccess

# Redirect direct requests to subdirectory back to root
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^WebsitesLive/Example/(.*) https://%{HTTP_HOST}/$1 [R=301,L]

# Rewrite to subdirectory
:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM