我需要重写 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 发出额外的子请求。
RewriteRule (US|EG) ?c=$1 [NC , L]
RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]
这些指令存在许多错误:
- 你说你已经尝试过这些,然而,错误的空格在里面旗帜当文件第一次被解析时,参数将立即导致 500 内部服务器错误。
- 如上所述,
RewriteRule
图案(第一个参数)仅匹配 URL 路径。不包括主机名。 - #1 中的正则表达式太过笼统,匹配“US”或“EG”任何地方。
- 为了匹配绝对 URL(正如您在第二个示例中尝试做的那样),您需要匹配
THE_REQUEST
服务器变量(其中包含请求标头的第一行,包括请求方法)。