Apache-2.2

重寫/限制apache中的特定域名

  • November 29, 2016

我們擁有https://example1.com/loginexample2.com/login託管在同一個 apache 伺服器 (2.2.22) 上。我想/login限制example1.com.

  • example1.com/login–> 404(最好)或 403
  • example2.com/login–> 登錄頁面

我試過

<Location /login>
Order Deny,Allow
Deny from example1.com
Allow from example2.com
</Location>

/login它同時禁用example1.comexample2.com。我可以限制example1.com嗎?

您可以使用 mod_rewrite 來執行此操作,它允許您檢查訪問站點的*主機。*在您的伺服器配置(或<Directory>部分或.htaccess文件)中嘗試以下操作:

RewriteEngine On
RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteRule ^/?login$ - [R=404,L]

如果您請求,上述服務將提供 404 Not Found,但如果您請求example1.com/login,則不會執行任何操作example2.com/login(該請求將被允許通過)。

CondPattern上的=前綴使其成為精確的字典比較,而不是正則表達式,因此無需轉義點或使用anchorsRewriteCond

為了提供 403 Forbidden,您可以更改 上的標誌RewriteRule,例如:

RewriteRule ^/?login$ - [F]

<Location /login>
Order Deny,Allow
Deny from example1.com
Allow from example2.com
</Location>

/login它同時禁用example1.comexample2.com

我很好奇……這似乎允許所有訪問,而不是拒絕它?該Deny from ...指令拒絕訪問使用者example1.com(通過對遠端 IP 地址的反向 DNS 查找),而不是訪問example1.com主機的使用者。Denyor指令都不Allow應該匹配,所以它應該預設Allow。(?)


…如何為同一個 RewriteCond 添加多個重寫條件?

**更新:**請注意,RewriteCond指令(即條件)適用於RewriteRule隨後的單個指令。繼續上面的範例,如果您希望僅阻止幾個 URL(例如/login/demo/test),example1.com那麼您可以將所有這些組合在RewriteRule 模式中。例如:

RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteRule ^/?(login|demo|test)$ - [R=404,L]

在這種情況下這是可以的,因為 URL 是有限的,而且都很短。或者,您可以為每個 URL 創建一個條件並使用該OR標誌。例如:

RewriteCond %{HTTP_HOST} =example1.com [NC]
RewriteCond %{REQUEST_URI} ^/login$ [OR]
RewriteCond %{REQUEST_URI} ^/demo$ [OR]
RewriteCond %{REQUEST_URI} ^/test$
RewriteRule ^ - [R=404,L]

這表明……對於所有的 URL,其中HTTP_HOSTisexample1.com URL 要麼是要麼*,要麼*/login 然後 提供 404 錯誤文件。但是,第一個範例(使用模式)會更有效,因為這是首先處理的內容。/demo /test``RewriteRule

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