.htaccess 文件中的重写规则不适用于主域的子域

Rewrite Rule in .htaccess file not working for subdomain to main domain

基本上,我工作的公司有一个站点,该站点托管多个不同商店的页面。每个商店在 cpanel 中都有自己的子域规则,因此用户可以从传单中输入简单的 url 以访问其本地商店的站点。不过最近,Bing 已经开始为我们的一个子域编制索引,这给我们的客户带来了一些困惑,因为 link 显示为 https://[citystate].example.com/find-us/altstate/altcity

我已经查看了几个文件并得出了这样的结论,据我所见,应该可以但不能。

RewriteCond %{HTTP_HOST} ^[citystate]\.example\.com
RewriteRule ^(.*)$ https://example\.com\/ [L]

有人可以帮助我哪里出错了吗?

更新:上面的部分正在运行,但 URL 被重定向到索引页面,因为该页面正在出现,就好像它不存在一样。但是,如果我使用 link 并在单独的浏览器 window/tab 中打开它,它就会弹出。让我感到困惑。

RewriteCond %{HTTP_HOST} ^[citystate]\.example\.com
RewriteRule ^(.*)$ https://example\.com\/ [L]

此规则需要靠近 .htaccess 文件的顶部,以避免与其他指令发生冲突。

但是,有几个潜在的问题:

  • 正则表达式片段 [citystate] 仅匹配字符 class 中的一个字符。 []表示字符class。所以这匹配 citystae - 只有一个字符。您需要按字面意思指定单词,不带方括号。但是,如果您有许多“城市”,那么这需要为每个城市制定一条规则,您可以使正则表达式更通用以匹配任何城市。例如。 [a-z]+(即 az 范围内的 1 个或多个小写字母。)

  • 您缺少 RewriteRule 上的 R (redirect) 标志。例如。 [R,L][R=301,L]。但是,由于您在目标 URL 上指定了方案 + 主机名,它将隐式触发 302(临时)重定向 - 这没关系。但是,为了解决 Bing 的问题,这需要一个 301(永久)重定向。但是,请先使用 302(临时)重定向进行测试,以避免潜在的缓存问题。

小问题:

  • ^(.*)$ - 默认情况下,正则表达式是贪婪的,因此 ^$(开始和 end-of-string)锚点是多余的。

  • RewriteRule substitution 中不需要反斜杠转义文字点和斜杠,因为这是一个“普通”字符串,而不是正则表达式。

改为尝试以下操作:

RewriteCond %{HTTP_HOST} ^[a-z]+\.example\.com
RewriteRule (.*) https://example.com/ [R=301,L]

如果 URL-path 没有被 </code> 反向引用正确捕获,那么您可以改用 <code>REQUEST_URI 服务器变量。例如:

RewriteCond %{HTTP_HOST} ^[a-z]+\.example\.com
RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L]

请注意,REQUEST_URI 服务器变量包含一个斜杠前缀,因此从 substitution 字符串中省略。