2016-01-08 178 views
2

我想附加子域作为查询使用htaccess最终现有的查询。.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叙述在

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

我的错误,应该是$ 1,但它仍然没有工作... –

+0

关于您的编辑:你能不能只是选择了另一个参数名称而不是'x' - 这在原始请求中不太可能作为查询字符串参数名出现......? – CBroe

+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(?:&|$)这意味着随后通过字面x= followd定界符::%1然后\1是向后引用为%1(党团::之前)。 !之前^有否定条件。简单地说,这个条件意味着只有在QUERY_STRING中没有x=subdomain时才执行此规则。
+0

我得到一个内部服务器错误,但我不得不提及,我使用cakephp,所以它可能是cakephp的问题。我删除了所有其他规则... –

+0

在cakephp中,我必须将所有内容重定向到index.php,你能帮助我吗? –

+0

尝试我现在​​更新的答案并检查'$ _SERVER [“QUERY_STRING”]' – anubhava

0

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

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

所以这应该做的伎俩(与现有的RewriteConds合并):

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

我将它添加到htaccess文件中,当我输入'http://x.domain.com/a?b=c'时,我得到下面的数组'''a'=>'','b'=>' C']'。 所以x完全不存在 –

+0

使用这个'RewriteRule(。*)index.php?$ 1&alias =%1 [QSA,L]'确实有效。但现在我有另一个问题。我会更新我的问题... –