.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=defsubsub.subdomain.tld?abc=def&m=true

我尝试了以下代码,但它不起作用:

RewriteEngine On
ReWriteCond %{HTTP_HOST} m.subsub.subdomain.tld
ReWriteCond %{REQUEST_URI} ^m/
ReWriteRule ^(.*)$ ?=m=true[L]

我试图了解 ReWriteCondReWriteRule 的工作原理,但我没有理解,所以我需要你的帮助。

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(查询字符串追加)标志。
  • ReWriteCondReWriteRule应该分别写成RewriteCondRewriteRule。虽然这只是约定,但这不是错误。

试试下面的方法:

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(永久)(如果这是永久性的)。