.htaccess: ajoute un sous-domaine comme requête aux requêtes existantes

J’essaie d’append le sous-domaine en tant que requête à d’éventuelles requêtes existantes à l’aide de htaccess.

http://test.domain.com devrait être http://test.domain.com?x=test http://test.domain.com?id=1 devrait être http://test.domain.com?id=1&x=test

C’est ce que j’ai fait, mais ça ne marche pas et je peux comprendre pourquoi:

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

Ma compréhension était

[^\?]* Tous les caractères sauf?, correspondent à 0 ou plusieurs fois

(?: début d’un groupe non capturé

\? rencontre ? Littéralement

(.*) tous les caractères après? en tant que groupe

)? fin du groupe non capturé, correspond à 0 ou 1 fois

Mais ça ne marche pas. Où est mon erreur?

MISE À JOUR 1:

Je pourrais le faire fonctionner en utilisant la règle suivante

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

http://test1.domain.com?y=test1 m’apporte [x=>test1,y=>test2]

mais

http://test1.domain.com?y=test1&x=test3 m’apporte [x=>test3,y=>test2]

Donc, il remplace ma valeur x. Est-il possible de bloquer cela?

MISE À JOUR 2

C’est le code que j’utilise maintenant: RewriteEngine On

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

Essayez cette règle:

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

Assurez-vous que c’est la seule règle que vous avez dans .htaccess lors du test.

Explication de:

 RewriteCond %{HTTP_HOST} ^(?!www)([\w-]+)\. [NC] RewriteCond %1::%{QUERY_STRING} !^(.+?)::x=\1(?:&|$) [NC] 
  1. Nous capturons la première partie du nom d’hôte à partir de ce groupe: ([\w-]+) qui est noté %1 . Notez que nous ne pouvons pas utiliser %1 dans RHS d’une condition.
  2. Nous ajoutons ensuite %1 et %{QUERY_STRING} ensemble dans %1::%{QUERY_STRING} . Nous pourrions utiliser ici tout autre délimiteur arbitraire comme ## .
  3. Dans RHS, nous avons ^(.+?)::x=\1(?:&|$) qui signifie %1 suivi de delimiter :: followd par littéral x= et ensuite \1 qui est la référence arrière pour %1 ( groupe avant :: :). ! avant ^ est là pour nier la condition. En termes simples, cette condition signifie exécuter cette règle uniquement si nous n’avons pas déjà x=subdomain dans QUERY_STRING .

On dirait que vous essayez de faire correspondre le contenu de la chaîne de requête avec le modèle de votre RewriteRule – cela n’est pas possible, il recherche uniquement le composant path de l’URL demandée.

Mais, pas de soucis, il existe une solution simple qui permet de combiner la chaîne de requête d’origine et la correspondance entre le modèle: l’indicateur QSA .

Donc, cela devrait faire l’affaire (combiné avec vos RewriteConds existants):

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