【问题标题】:.htaccess: Redirect from subdomain to domain with get-request.htaccess:使用 get-request 从子域重定向到域
【发布时间】:2018-02-07 03:56:13
【问题描述】:
我正在尝试从 m.subsub.subdomain.tld 重定向到 subsub.subdomain.tld?m=true。所以基本上,我想添加一个 GET 请求。现有的 GET 应该保持原样,所以 m.subsub.subdomain.tld?abc=def 到 subsub.subdomain.tld?abc=def&m=true。
我尝试了以下代码,但它不起作用:
RewriteEngine On
ReWriteCond %{HTTP_HOST} m.subsub.subdomain.tld
ReWriteCond %{REQUEST_URI} ^m/
ReWriteRule ^(.*)$ ?=m=true[L]
我试图了解 ReWriteCond 和 ReWriteRule 是如何工作的,但我没有明白,所以我需要你的帮助。
【问题讨论】:
标签:
.htaccess
redirect
mod-rewrite
get
subdomain
【解决方案1】:
ReWriteCond %{HTTP_HOST} m.subsub.subdomain.tld
ReWriteCond %{REQUEST_URI} ^m/
ReWriteRule ^(.*)$ ?=m=true[L]
这有很多问题:
-
REQUEST_URI 包含 URL 路径(以斜杠开头),所以我不确定您要与 ^m/ 匹配什么?
-
m.subsub.subdomain.tld - RewriteCond 指令的第二个参数是一个正则表达式。为了匹配文字点,点需要进行反斜杠转义,否则它匹配任何字符。
- 您正在使用
(.*) 捕获 URL 路径 - 这是必需的吗?您的示例中不需要它。您的示例源 URL 和目标 URL 的 URL 路径为空。
-
?=m=true[L] - 你有一个错误的= 之前 m。您在 RewriteRule 标志 ([L]) 之前缺少 空格 分隔符 - 这将被视为 替换 的一部分。
- 由于您没有指定(有效)
R 标志或方案+主机名,这将导致内部重写,而不是重定向。
- 如果你想重定向到不同的主机,你需要在替换中指定这个。
- 除非您明确包含 QSA(查询字符串附加)标志,否则原始查询字符串将被丢弃。
-
ReWriteCond 和 ReWriteRule 应该分别写成 RewriteCond 和 RewriteRule。虽然这只是惯例,但这并不是错误。
请尝试以下方法:
RewriteEngine On
RewriteCond %{HTTP_HOST} ^m\.subsub\.subdomain\.tld [NC]
RewriteRule ^ http://subsub.subdomain.tld?m=true [R=302,QSA,L]
现有的 GET 应该保持原样,所以 m.subsub.subdomain.tld?abc=def 到 subsub.subdomain.tld?abc=def&m=true
请注意,这将导致查询字符串反过来。 IE。请求中的现有查询字符串将被附加,而不是作为新查询字符串的前缀。那是问题吗? IE。 ?m=true&abc=def,不是?abc=def&m=true。
这也是一个临时 (302) 重定向。仅当您确定它工作正常时才将其更改为 301(永久)。