Comment puis-je correspondre à www et non www dans un rewritecond?
-
14-10-2019 - |
Question
J'ai un RewriteMap qui a une liste de domaines à rediriger. À l'heure actuelle, je dois la liste www.foo.com et foo.com sur la carte de réécriture. Je me demandais s'il y avait un moyen d'avoir le contrôle de rewritecond pour les www et non www dans la même ligne.
# Rewrite Map
foo.com file.php
www.foo.com file.php
# modrewrite
RewriteCond ${domainmappings:%{HTTP_HOST}} ^(.+)$ [NC]
RewriteCond %1 !^NOTFOUND$
RewriteRule ^.*$ www.domain.com/%1 [L,R=301]
J'ai essayé de faire des choses comme (www.)% {HTTP_HOST} ou ^ (www.)% {HTTP_HOST}, mais pas de chance.
La solution
Cela devrait le faire:
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)
RewriteCond ${domainmappings:%2} ^(.+)$ [NC]
RewriteRule ^ /%1 [L,R=301]
La première RewriteCond
supprimera le préfixe optionnel www.
. Le reste est alors utilisée comme paramètre pour la carte de réécriture dans la seconde RewriteCond
.
Une carte de réécriture de fichier texte retourne une chaîne vide si aucune correspondance se trouve:
Si la clé est trouvée, la construction carte-fonction est remplacée par valeur de remplacement . Si la clé est introuvable, il est substitué par DefaultValue ou par la chaîne vide si aucun DefaultValue a été spécifié.
Donc, si la deuxième condition est remplie (notez le ^(.+)$
), une correspondance a été trouvée et %1
contiendra les valeur de remplacement (dans ce cas file.php
).
Autres conseils
D'un message ici
http://www.eukhost.com / forums / F15 / simple rewriterule-set-redirect-domain-6570 /
RewriteEngine on
RewriteCond %{HTTP_HOST} ^xyz.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.xyz.com$
RewriteRule ^(.*)$ http://www.xyz.com/test//$1 [R=301,L]
Vous pouvez essayer de faire le www. partie facultative avec ce qui suit:
# Rewrite Map
www.foo.com file.php
# modrewrite
# redirect to www domain always
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)$
RewriteRule (.*) http://www\.%1/$1 [L,R=301,QSA)
# redirect following the map
RewriteCond ${domainmappings:%{HTTP_HOST}} ^(.+)$ [NC]
RewriteCond %1 !^NOTFOUND$
RewriteRule ^.*$ www.domain.com/%1 [L,R=301]
Ce serait d'abord rediriger anything.anything
à www.anything.anything
puis appliquer votre règle à la prochaine requête. Pas trop bien informé des cartes rewrite mais si aucune garantie.
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.domain.com$
RewriteRule ^ https://www.domain.com%{REQUEST_URI} [R=301,L]