.htaccess:使用 get-request 从子域重定向到域
.htaccess: Redirect from subdomain to domain with get-request
我正在尝试从 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
的工作原理,但我没有理解,所以我需要你的帮助。
ReWriteCond %{HTTP_HOST} m.subsub.subdomain.tld
ReWriteCond %{REQUEST_URI} ^m/
ReWriteRule ^(.*)$ ?=m=true[L]
这有很多问题:
REQUEST_URI
包含 URL 路径(以斜线开头),所以我不确定您要与 ^m/
?[=55= 匹配什么]
m.subsub.subdomain.tld
- RewriteCond
指令的第二个参数是一个正则表达式。点需要反斜杠转义才能匹配文字点,否则匹配 任何字符.
- 您正在使用
(.*)
捕获 URL 路径 - 这是必需的吗?在您的示例中不需要它。您的示例源和目标 URLs 有一个空的 URL-path.
?=m=true[L]
- 你有一个错误的 =
before m
。在 RewriteRule
标志 ([L]
) 之前缺少 space 分隔符 - 这将被视为 替换的一部分.
- 由于您没有指定(有效的)
R
标志或方案+主机名,这将导致内部重写,而不是重定向。
- 如果你想重定向到不同的主机,你需要在 substitution.
中指定
- 原始查询字符串将被丢弃,除非您明确包含 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]
The existing GETs should stay like they are, so m.subsub.subdomain.tld?abc=def
to subsub.subdomain.tld?abc=def&m=true
请注意,这将导致查询字符串相反。 IE。来自请求的现有查询字符串将被附加,而不是作为新查询字符串的前缀。那是问题吗? IE。 ?m=true&abc=def
,不是 ?abc=def&m=true
。
这也是一个临时 (302) 重定向。仅当您确定它工作正常时才将其更改为 301(永久)(如果这是永久性的)。
我正在尝试从 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
的工作原理,但我没有理解,所以我需要你的帮助。
ReWriteCond %{HTTP_HOST} m.subsub.subdomain.tld ReWriteCond %{REQUEST_URI} ^m/ ReWriteRule ^(.*)$ ?=m=true[L]
这有很多问题:
REQUEST_URI
包含 URL 路径(以斜线开头),所以我不确定您要与^m/
?[=55= 匹配什么]m.subsub.subdomain.tld
-RewriteCond
指令的第二个参数是一个正则表达式。点需要反斜杠转义才能匹配文字点,否则匹配 任何字符.- 您正在使用
(.*)
捕获 URL 路径 - 这是必需的吗?在您的示例中不需要它。您的示例源和目标 URLs 有一个空的 URL-path. ?=m=true[L]
- 你有一个错误的=
beforem
。在RewriteRule
标志 ([L]
) 之前缺少 space 分隔符 - 这将被视为 替换的一部分.- 由于您没有指定(有效的)
R
标志或方案+主机名,这将导致内部重写,而不是重定向。 - 如果你想重定向到不同的主机,你需要在 substitution. 中指定
- 原始查询字符串将被丢弃,除非您明确包含 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]
The existing GETs should stay like they are, so
m.subsub.subdomain.tld?abc=def
tosubsub.subdomain.tld?abc=def&m=true
请注意,这将导致查询字符串相反。 IE。来自请求的现有查询字符串将被附加,而不是作为新查询字符串的前缀。那是问题吗? IE。 ?m=true&abc=def
,不是 ?abc=def&m=true
。
这也是一个临时 (302) 重定向。仅当您确定它工作正常时才将其更改为 301(永久)(如果这是永久性的)。