.htaccess:将子域追加为现有查询的查询

时间:2016-01-08 19:23:26

标签: regex apache .htaccess mod-rewrite

我正在尝试使用htaccess将子域作为查询附加到最终的现有查询。

http://test.domain.com应为http://test.domain.com?x=test http://test.domain.com?id=1应为http://test.domain.com?id=1&x=test

这就是我所做的,但它不起作用,我可以找出原因:

RewriteCond %{HTTP_HOST} ^([a-z0-9_-]+)\.domain\.com$ [NC]
// exclude www.domain.com
RewriteCond %1 !^(www)$ [NC]
RewriteRule ^[^\?]*(?:\?(.*))?$ index.php?$1&x=%1 [L]

我的理解是

[^\?]*除?之外的所有字符,匹配0次或更多次

(?:非捕获组的开始

\?匹配?字面上

(.*)之后的所有人物?作为一个群体

)?非捕获组结束,匹配0或1次

但它不起作用。我的错误在哪里?

更新1:

我可以使用以下规则使其工作

RewriteRule (.*) index.php?$1&x=%1 [QSA,L]

http://test1.domain.com?y=test1给我[x=>test1,y=>test2]

但是

http://test1.domain.com?y=test1&x=test3给我[x=>test3,y=>test2]

所以它会覆盖我的x值。有办法阻止吗?

更新2

这是我现在使用的代码: RewriteEngine On

RewriteCond %{HTTP_HOST} ^(?!www)([\w-]+)\. [NC]
RewriteCond %1::%{QUERY_STRING} !^(.+?)::x=\1(?:&|$) [NC]
RewriteRule ^ index.php?%{QUERY_STRING}&x=%1 [L]

2 个答案:

答案 0 :(得分:1)

尝试此规则:

RewriteEngine On 

RewriteCond %{HTTP_HOST} ^(?!www)([\w-]+)\. [NC]
RewriteCond %1::%{QUERY_STRING} !^(.+?)::x=\1(?:&|$) [NC]
RewriteRule ^ index.php?%{QUERY_STRING}&x=%1 [L]

确保这是测试时.htaccess中唯一的规则。

解释:

RewriteCond %{HTTP_HOST} ^(?!www)([\w-]+)\. [NC]
RewriteCond %1::%{QUERY_STRING} !^(.+?)::x=\1(?:&|$) [NC] 
  1. 我们正在捕获此群组中主机名的起始部分:([\w-]+),由%1表示。请注意,我们不能在条件的RHS中使用%1
  2. 然后,我们将%1%{QUERY_STRING}添加到%1::%{QUERY_STRING}中。在这里,我们也可以使用任何其他任意分隔符,例如##
  3. 在RHS中我们有^(.+?)::x=\1(?:&|$),其后是%1,后跟分隔符::,后跟文字x=,然后是\1,它是{%1的反向引用1}}(在::之前的goup)。 !之前的^可以否定条件。简单来说,这个条件意味着只有在x=subdomain中我们没有QUERY_STRING时才执行此规则。

答案 1 :(得分:0)

看起来您正在尝试将查询字符串内容与RewriteRule的模式匹配 - 这是不可能的,它只搜索请求的URL的路径组件。

但是,不用担心 - 有一个简单的解决方案可以帮助组合原始查询字符串,以及模式匹配的内容:QSA标记。

所以这应该可以解决问题(结合你现有的RewriteConds):

RewriteRule (.*) index.php?$1 [QSA,L]