.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。所以这匹配 c
、i
、t
、y
、s
、t
、a
或 e
- 只有一个字符。您需要按字面意思指定单词,不带方括号。但是,如果您有许多“城市”,那么这需要为每个城市制定一条规则,您可以使正则表达式更通用以匹配任何城市。例如。 [a-z]+
(即 a
到 z
范围内的 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 字符串中省略。
基本上,我工作的公司有一个站点,该站点托管多个不同商店的页面。每个商店在 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。所以这匹配c
、i
、t
、y
、s
、t
、a
或e
- 只有一个字符。您需要按字面意思指定单词,不带方括号。但是,如果您有许多“城市”,那么这需要为每个城市制定一条规则,您可以使正则表达式更通用以匹配任何城市。例如。[a-z]+
(即a
到z
范围内的 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 字符串中省略。