我正在尝试使用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]
答案 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]
([\w-]+)
,由%1
表示。请注意,我们不能在条件的RHS中使用%1
。%1
和%{QUERY_STRING}
添加到%1::%{QUERY_STRING}
中。在这里,我们也可以使用任何其他任意分隔符,例如##
。^(.+?)::x=\1(?:&|$)
,其后是%1
,后跟分隔符::
,后跟文字x=
,然后是\1
,它是{%1
的反向引用1}}(在::
之前的goup)。 !
之前的^
可以否定条件。简单来说,这个条件意味着只有在x=subdomain
中我们没有QUERY_STRING
时才执行此规则。答案 1 :(得分:0)
看起来您正在尝试将查询字符串内容与RewriteRule的模式匹配 - 这是不可能的,它只搜索请求的URL的路径组件。
但是,不用担心 - 有一个简单的解决方案可以帮助组合原始查询字符串,以及模式匹配的内容:QSA
标记。
所以这应该可以解决问题(结合你现有的RewriteConds):
RewriteRule (.*) index.php?$1 [QSA,L]