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

问题描述

从本质上来说,我所工作的公司拥有一个网站,托管着一些不同商店的页面。每个商店在cpanel中都有其自己的子域规则,因此用户可以输入传单中的简单网址,以到达其本地商店的站点。不过,由于链接显示为https:// [citystate] .example.com / find-us / altstate / altcity

,因此Bing最近已开始为我们的一个子域建立索引,这给我们的客户造成了一些混乱。

我已经浏览了几个文件,到目前为止,从我所看到的情况来看,该文件应该可以工作,但是不可以。

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

有人可以帮我解决问题吗?

更新:上面的代码正在工作,但是URL被重定向到索引页面,因为该页面似乎不存在。但是,如果我获取链接并在单独的浏览器窗口/选项卡中将其打开,则会将其拉出。让我感到困惑。

解决方法

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

此规则必须放在.htaccess文件的顶部,以避免与其他指令冲突。

但是,有两个潜在问题:

  • 正则表达式摘录[citystate]仅与字符类中的单个字符匹配。 []表示字符类。因此,这与citysta或{{1} }-仅一个字符。您需要按原样指定单词,没有方括号。但是,如果您有很多“城市”,那么这需要每个城市都有一条规则,您可以使正则表达式更通用,以匹配任何城市。例如。 e(即[a-z]+a范围内的1个或多个小写字母。)

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

次要问题:

  • [R=301,L]-默认情况下,正则表达式是贪婪的,因此^(.*)$^(字符串的开始和结尾)锚是多余的。

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

请尝试以下操作:

RewriteRule

如果RewriteCond %{HTTP_HOST} ^[a-z]+\.example\.com RewriteRule (.*) https://example.com/$1 [R=301,L] 后向引用未正确捕获URL路径,则可以改用$1服务器变量。例如:

REQUEST_URI

请注意,RewriteCond %{HTTP_HOST} ^[a-z]+\.example\.com RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L] 服务器变量包含一个斜杠前缀,因此在 substitution 字符串中将其省略。