问题描述
从本质上来说,我所工作的公司拥有一个网站,托管着一些不同商店的页面。每个商店在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]
仅与字符类中的单个字符匹配。[
和]
表示字符类。因此,这与c
,i
,t
,y
,s
,t
,a
或{{1} }-仅一个字符。您需要按原样指定单词,没有方括号。但是,如果您有很多“城市”,那么这需要每个城市都有一条规则,您可以使正则表达式更通用,以匹配任何城市。例如。e
(即[a-z]+
至a
范围内的1个或多个小写字母。) -
您缺少
z
上的R
(redirect
)标志。例如。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 字符串中将其省略。