.htaccess 重定向除单个域的 Root

.htaccess Redirect except for Root of a single domain

假设我有三个域:domain1.tld、domain2.tld 和 domain3.tld

所有请求都应重定向到新域。tld/new 除了 domain1.tld 的根目录。 但不幸的是我的例外不起作用:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain1\.tld$ [OR]
RewriteCond %{HTTP_HOST} ^www\.domain1\.tld$
RewriteRule ^/$ https://newdomain.tld/new [L,R=301]

RewriteCond %{HTTP_HOST} !^domain1\.tld$ [OR]
RewriteCond %{HTTP_HOST} !^www\.domain1\.tld$
RewriteRule ^(.*)$ https://newdomain.tld/new [R=301,L]

如果不是 RewriteRule 模式 ^/$,您的第一条规则似乎会执行您试图阻止的特定重定向,永远不会匹配,所以第一条规则实际上没有做任何事情。

第二条规则不会将任何请求重定向到 domain1.tld,因此,domain1.tld/ 也不会被第二条规则重定向。

确保您没有看到缓存的响应。 301(永久)重定向由浏览器持久缓存,因此请始终先使用 302 进行测试以避免潜在的缓存问题。

一些额外的假设:

  • newdomain.tld 指向不同的服务器。

  • 您不需要从 domain1.tld/ 的页面提供任何静态资源(CSS、JS、图像等)- 因为这些将被重定向到 newdomain.tld。例外仅适用于对文档根目录的请求。

试试这样:

RewriteEngine On

# Exception for "domain1.tld/"
RewriteCond %{HTTP_HOST} ^(www\.)?domain1\.tld [NC]
RewriteRule ^$ - [L]

# Everything else redirects to "newdomain.tld/new"
RewriteRule ^ https://newdomain.tld/new [QSD,R=301,L]

请注意 RewriteRule 模式 (第一个参数)匹配 URL-path,减去斜杠前缀。 IE。 ^$ URL-path)匹配根。 (您只能在服务器上下文中使用 ^/$。)

注意:您需要先清除浏览器缓存,然后再使用 302 进行测试。