htaccess 重写国家/地区(无子域名)

htaccess 重写国家/地区(无子域名)

我需要重写 URL

us.example.com

example.com?country=us

无子域名

我尝试了以下两条规则:

1.

RewriteRule (US|EG) ?c=$1 [NC , L]

2.

RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

但它们没有作用。

那么..有什么办法可以做到这一点吗?

答案1

您无法跨不同的主机名“重写” URL(您需要实现反向代理),并且我认为“重定向”是不可取的。

但是,如果子域和主域都指向文件系统的同一区域,则无需更改主机名/域。只需进行普通重写(在同一主机上)即可。

要检查请求主机上的子域,您需要一个条件(RewriteCond指令)来检查HTTP_HOST服务器变量(即 HTTP 请求标头的值Host)。RewriteRule 图案仅与 URL 的 URL 路径部分匹配。

例如:

RewriteEngine On

RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]

如上所述,这假设子域和主域指向文件系统的同一区域。这在所有请求都由单个 CMS 管理的系统中很常见。(并且您没有尝试更改示例指令中的主机名。)

反向%1引用保存来自请求主机名的子域(此示例中为“us”或“eg”)。

检查查询字符串中是否存在country=URL 参数的附加条件是为了防止重写循环。

但是,您没有说明任何有关 URL 路径的信息?您应该直接重写到处理请求的文件(index.php?)。在当前状态下,上述“重写”依赖于 mod_dir 为 DirectoryIndex 发出额外的子请求。


  1. RewriteRule (US|EG) ?c=$1 [NC , L]
  2. RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

这些指令存在许多错误:

  • 你说你已经尝试过这些,然而,错误的空格在里面旗帜当文件第一次被解析时,参数将立即导致 500 内部服务器错误。
  • 如上所述,RewriteRule 图案(第一个参数)仅匹配 URL 路径。不包括主机名。
  • #1 中的正则表达式太过笼统,匹配“US”或“EG”任何地方
  • 为了匹配绝对 URL(正如您在第二个示例中尝试做的那样),您需要匹配THE_REQUEST服务器变量(其中包含请求标头的第一行,包括请求方法)。

相关内容