Mod-Rewrite

mod_rewrite - 如果 %{HTTP_HOST} 不是任何 ServerName/ServerAlias,則 RewriteCond

  • June 26, 2018

我想知道如果 %{HTTP_HOST} 不是 ServerName 或任何列出的 ServerAlias,是否可以創建重寫條件。

我的目標是將任何請求重定向到未列為 ServerName、ServerAlias 的域或直接到 IP(http://1.1.1.1>、<https://1.1.1.2 ……)。


目前,我通過在我的非 SSL 到 SSL 重定向中執行以下操作來實現這一點。在我的非 SSL 到 SSL 重定向規則之後,我有一個全部規則,如果 {HTTP_HOST} 不是 example.com 則轉發到我的真實域。

我的 SSL 流量有類似的重寫規則,在我的非 WWW 到 WWW 重寫規則之後,我有我的全部規則。

&lt;VirtualHost *:80&gt;
ServerName  domain1.com
ServerAlias domain2.com domain3.com
DocumentRoot /home/domain/public_html
RewriteEngine on
RewriteCond %{SERVER_NAME} =domain1.com [OR]
RewriteCond %{SERVER_NAME} =domain2.com [OR]
RewriteCond %{SERVER_NAME} =domain3.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,NE,R=permanent]
RewriteCond %{HTTP_HOST} !^example\.com$
RewriteRule ^(.*)$ https://domain1.com$1 [R=301,NC]
&lt;/VirtualHost&gt;

我很好奇最後一個重寫規則是否有更好的實現,如果 HTTP_HOST 不是列出的 ServerAlias 或 ServerName 中的任何一個。

我的網路應用程序用於簡單的網路測試(ping 我的 ip、traceroute 等),因此使用者可以輕鬆獲得多個 IP 地址。我只想確保任何未使用列出的伺服器地址之一或直接發送到 IP 地址的請求都被重定向到我的主域。以上確實有效,我只是想知道是否有更好的方法。

你多慮了。您不需要將所有邏輯都放在 RewriteConds 中。

ServerName當 Apache 收到一個與任何 VirtualHost 中的任何或指令都不匹配的主機的請求時ServerAlias,它將使用預設的 VirtualHost - 即配置中的第一個。因此,只需將您的重寫規則放在一個單獨的 VirtualDomain 中,並確保首先載入一個,方法是在配置文件中首先列出它,或者在您保留 VirtualHosts 的目錄中將其命名為“00-default.conf”。

由於該 VirtualHost 中的配置僅在有人連接並使用未以其他方式列出的域名時使用,因此您無需否定任何其他域名。配置可以很簡單

&lt;VirtualHost *:80&gt;
ServerName  default.example.net
DocumentRoot /home/domain/public_html
RewriteEngine on
RewriteRule ^(.*)$ https://example.com$1 [R=301,NC]
&lt;/VirtualHost&gt;

有關Apache 如何選擇使用哪個 VirtualHost 的更詳細說明,請參閱https://serverfault.com/a/520201/120438 。

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