Redirection htaccess générique www vers non-www

485

Je voudrais rediriger www.example.comvers example.com. Le code htaccess suivant rend cela possible:

RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

Mais, existe-t-il un moyen de le faire de manière générique sans coder en dur le nom de domaine?

puits profond
la source
64
Il est important de savoir que si vous n'utilisez pas un www (ou un autre sous-domaine), tous les cookies seront soumis à chaque sous-domaine et vous ne pourrez pas avoir un sous-domaine sans cookie pour servir du contenu statique, réduisant ainsi la quantité de données envoyées entre le navigateur et le serveur. Quelque chose que vous pourriez regretter plus tard: twitter.com/codinghorror/statuses/1637428313
Sam Hasler
3
Une autre chose à considérer, assurez-vous de définir le nom canonique sans le www dans vos pages, pour éviter une éventuelle pénalité de contenu en double. De plus, si vous avez des URL absolues dans vos liens, assurez-vous qu'elles ne sont pas toutes www.
Jeremy Morgan
À mon avis, il vaut mieux conserver la redirection explicite, surtout lors de la copie de la configuration pour un autre domaine, qui pourrait nécessiter un réglage différent (le domaine www est préférable dans certains cas) weboptimizer.ch/2014/01/redirection-www
snowflake
Une raison pour laquelle cette solution fonctionnerait dans tous les cas, à l'exception de l'URL racine? Par exemple, domain.com ne fait pas de piont vers domain.com , tandis que domain.com/page1 redirige vers domain.com/page1 .
Jeff Solomon
Si vous souhaitez rediriger www vers non-www tout en maintenant le protocole (HTTP ou HTTPS), consultez cette question connexe: Rediriger www vers non-www tout en conservant le protocole HTTP ou HTTPS
MrWhite

Réponses:

894
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Identique à Michael sauf que celui-ci fonctionne: P

Volomike
la source
16
Si cela ne fonctionne pas, il vous manque probablement le RewriteEngine Onprécurseur pour le faire fonctionner.
hendry
8
@Ben, comment pourrais-je utiliser cela à l'envers, pour ajouter www à un site Web non www?
anarkhos
18
Il redirige http://www.domain.com/vers http://domain.com//. Vous devez ajouter /à la RewruteRule. Cela fonctionne pour moi RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov,
13
J'avais le même problème que Vladimir en redirigeant vers http://domain.com//avec les doubles barres obliques. Donc je l'ai fait RewriteRule ^(.*)$ http://%1$1 [R=301,L] et cela semble fonctionner jusqu'à présent
bobfet1
5
Veuillez utiliser la solution suivante plutôt que de réécrire le moteur, c'est beaucoup plus rapide tout en étant élégant: stackoverflow.com/questions/1100343/…
Birla
111

Mais si nous devons le faire pour http et https séparés:

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Andron
la source
2
www.example.com/ redirige vers example.com// Comment supprimer la barre oblique supplémentaire?
Bobby S
Bonne question. Je suppose que la solution rapide sera d'utiliser des règles supplémentaires (c'est-à-dire uniquement pour ce cas) avant celles décrites ci-dessus. Par exemple: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron
3
@BobbyS J'ai utilisé la solution dans cet article . Il redirige www et HTTP vers HTTPS non www et gère également le suivi /.
totymedli
Vous obtiendrez seulement une barre oblique supplémentaire (au début du chemin URL), si vous aviez placé ces directives directement dans la configuration du serveur (ou virtualhost). En .htaccessvous ne devriez pas recevoir de barre oblique supplémentaire. (Juste pour noter, si vous effectuez cette redirection dans la configuration du serveur, vous ne devriez probablement pas utiliser mod_rewrite pour commencer ... un simple mod_alias Redirectdans le conteneur vhost approprié serait plus efficace et moins sujet aux erreurs.)
MrWhite
72

Rediriger non www vers www (les deux: http + https)

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Dmitriy
la source
4
@nightcoder C'est parce que ma solution de redirection inverse (de non-www vers www) par opposition à Andron
Dmitriy
2
Remarque: cette solution peut entraîner des problèmes si vous avez l'intention d'utiliser des noms de sous-domaine à d'autres fins. Par exemple, app.votredomaine.com sera redirigé vers www.app.votredomaine.com.
Marty ZHANG du
1
C'est exactement le contraire d'une réponse à la question.
John
J'ai dû ajouter RewriteEngine Onet RewriteBase /, mais sinon, cela a bien fonctionné.
overthink
45

Si vous voulez le faire dans le fichier httpd.conf, vous pouvez le faire sans mod_rewrite (et apparemment c'est meilleur pour les performances).

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

J'ai obtenu cette réponse ici: /server/120488/redirect-url-within-apache-virtualhost/120507#120507

William Denniss
la source
33

Voici les règles pour rediriger une URL www vers no-www:

#########################
# redirect www to no-www
#########################

RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^(.*) http://%1/$1 [R=301,NE,L]

Voici les règles pour rediriger une URL sans www vers www:

#########################
# redirect no-www to www
#########################

RewriteCond %{HTTP_HOST} ^(?!www\.)(.+) [NC]
RewriteRule ^(.*) http://www.%1/$1 [R=301,NE,L]

Notez que j'ai utilisé l' NEindicateur pour empêcher apache d'échapper à la chaîne de requête. Sans ce drapeau, apache changera l'URL demandée http://www.example.com/?foo%20barenhttp://www.example.com/?foo%2250bar

Salman A
la source
1
pouvez-vous écrire du code pour rediriger http vers https avec rediriger www vers non-www
HYDER ALI
Modifiez http: // en https: // pour le forcer en HTTPS lorsqu'il change. Vous voudrez également ajouter une redirection http-> https régulière pour le trafic qui n'est pas redirigé par ces règles.
diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

Le RewriteCondcapture tout dans la HTTP_HOSTvariable après le www.et l'enregistre %1.

Le RewriteRulecapture l'URL sans le début /et l'enregistre $1.

Michael Cramer
la source
1
sans leading "/"- Dans .htaccess(comme indiqué dans la question), il n'y a pas de début /, donc le modèle ne correspond jamais et la redirection ne se produit jamais. (Il n'y a qu'une barre oblique dans un contexte serveur ou virtualhost .) De plus, si vous avez des directives mod_rewrite après cela, vous aurez besoin de l' Lindicateur.
MrWhite
7

Essaye ça:

RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ %{HTTP_HOST}$1 [C]
RewriteRule ^www\.(.*)$ http://$1 [L,R=301]

Si l'hôte commence par www, nous collons tout l'hôte sur le début de l'URL, puis retirons le "www".

Greg
la source
1
RoBorg, malheureusement vos paramètres ne fonctionnent pas, si j'essaye ceci: example.com/hello/world je me retrouve ici: example.com/hello/world/world J'ai aussi dû ajouter une barre oblique après% {HTTP_POST} dans le First RewriteRule
deepwell
2
J'utilise Apache / 2.2.9 (Unix). Cela fonctionne pour www.website, qui redirige vers le site Web Mais pour ce qui suit: site Web / test -> va à: websitetest J'ai corrigé cela en ajoutant une autre / Deuxième erreur: site Web / test / n va à websitetest / n / n
deepwell
1
Même problème que @deepwell avec celui-ci.
neemzy
Les problèmes rencontrés par les lecteurs précédents sont dus au fait que ces directives sont destinées à la configuration du serveur (ou vhost), non .htaccess. Dans un contexte de répertoire ( .htaccess), vous devez changer le premier RewriteRulepour lire: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](nécessite Apache 2.2.12+). Notez l'ajout de la barre oblique et du DPIdrapeau (Discard Path Info) - pour éviter qu'une partie du chemin URL ne soit apparemment dupliquée (qui est en fait "chemin-info") comme indiqué dans les commentaires précédents. Cependant, il existe des directives plus simples - comme indiqué dans les autres réponses.
MrWhite
7

Gestionnaire WWW générique complet, http / https

Je n'ai pas vu de réponse complète. Je l'utilise pour gérer l'inclusion WWW.

  1. Générique. Ne nécessite pas d'informations sur le domaine.
  2. Force WWW sur le domaine principal: www.domain.com
  3. Supprime WWW sur les sous-domaines: sub.domain.com
  4. Préserve l'état HTTP / HTTPS.
  5. Autorise les cookies individuels pour les domaines / sous-domaines

Veuillez me faire savoir comment cela fonctionne ou si j'ai laissé une échappatoire.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
Gregor Macgregor
la source
La question d'origine demande de rediriger wwwvers non www. Vous forcez l'inclusion de www.
Vadim
6

Il peut y avoir beaucoup de désinformation sur les redirections htaccess, je trouve. Tout d'abord, assurez-vous que votre site fonctionne sous Unix à l'aide d'Apache et non sur un hôte Windows si vous vous attendez à ce que ce code fonctionne.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

(Assurez-vous cependant qu'il n'y a pas d'espaces entre chaque ligne de texte; j'ai ajouté un espace supplémentaire entre les lignes pour que cela apparaisse bien dans cette fenêtre.)

Il s'agit d'un extrait de code qui peut être utilisé pour diriger la version www de votre site vers la version http: //. Il existe d'autres codes similaires qui peuvent également être utilisés.

Redirection Htaccess
la source
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Pour le sous-dossier

pelajar
la source
3

Pour ceux qui ont besoin d'accéder à l'ensemble du site SANS le préfixe «www».

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

Jument sûr que vous l'ajoutez au fichier suivant

/site/location/.htaccess 
Meule
la source
Cet exemple n'est pas complet - vous ne définissez pas la protosslvariable d'environnement (ce n'est pas une variable standard / serveur). Ce sera toujours vide, donc sera toujours redirigé vers http. (L'idée derrière la définition protosslplus tôt dans le code est de savoir quand vous souhaitez conserver le protocole lors de la redirection. Cependant, ces jours-ci, vous devriez probablement rediriger httpstout le temps.)
MrWhite
3

Utilisation de .htaccess pour rediriger vers www ou non www:

Mettez simplement les lignes de code suivantes dans votre fichier racine principal .htaccess. Dans les deux cas, remplacez simplement domain.com par votre propre nom d'hôte.

Rediriger vers www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Rediriger vers non-www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

changer DOT en =>. !!!

Rohallah Hatami
la source
2

J'ai utilisé la règle ci-dessus pour transférer www vers no www et cela fonctionne bien pour la page d'accueil, mais sur les pages internes qu'ils transfèrent vers /index.php

J'ai trouvé cette autre règle dans mon fichier .htaccess qui est à l'origine de cela, mais je ne sais pas quoi faire à ce sujet. Toute suggestion sera appréciée:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]
Luc
la source
Vous devez placer les règles de redirection non www avant celles que vous avez citées.
Vladimir Jovanović
2

www à non www avec https

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Rajith Ramachandran
la source
2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Si vous souhaitez supprimer wwwles deux httpet https, utilisez ce qui suit:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

Cela redirige Non ssl

à

Et SSL

à

sur apache, 2.4.*vous pouvez accomplir cela en utilisant une directive Redirectwith if,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
starkeen
la source
2

utiliser: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Ou .htaccess:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]

et La méthode PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});
programme antimalware
la source
1

La seule façon de le faire fonctionner ...

RewriteEngine On
RewriteCond %{HTTP_HOST} ^site\.ro
RewriteRule (.*) http://www.site.ro/$1 [R=301,L]
sulfy
la source
1

Si vous forcez www. en url ou en forçant le protocole SSL, essayez ensuite d'utiliser les variations possibles du fichier htaccess, telles que:

RewriteEngine On
RewriteBase /

### Forcer WWW ###

Exemple de réécriture% {HTTP_HOST} ^ \ .com
RewriteRule (. *) Http://www.example.com/$1 [R = 301, L]

## Forcer SSL ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## Bloquer les IP ###
Ordre Refuser, Autoriser
Refuser de 256.251.0.139
Refuser de 199.127.0.259
mystique
la source
Apache peut écouter un autre port, par exemple 81. Donc au lieu de RewriteCond %{SERVER_PORT} 80je suggère d'utiliser une telle vérification plus universelle:RewriteCond %{HTTPS} off
Andron
1

La réponse sélectionnée et de nombreuses autres solutions ici ont supprimé la partie de l'URL après /, donc en gros, elle est toujours redirigée vers le domaine principal, du moins pour moi .. Donc j'ajoute un échantillon de travail en respectant le chemin complet après la barre oblique ..

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [L,R=301]
luky
la source
1

Approche alternative si la personnalisation .htaccess n'est pas l'option idéale:

J'ai créé un serveur de redirection simple pour un usage public. Ajoutez simplement un enregistrement A ou CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Plus d'infos: https://simpleredirect.net

Bobík
la source
0

Je ne sais pas pourquoi vous souhaitez supprimer www. Mais la version inverse serait:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

Et l'avantage de ce script est: si vous avez quelque chose comme test.whattimein.com ou tout autre (environnement de développement / test), il ne redirigera pas U vers l'environnement d'origine.

local
la source
2
Que le sous-domaine www soit inclus ou non est vraiment une question de préférence personnelle et peut dépendre du nom de domaine et du public cible. Le code générique affiché ci-dessus pour rediriger www vers none-www gère également les environnements de test OK, car la redirection ne se produit que lorsque le "www". un sous-domaine est rencontré.
MrWhite
1
Cette question fait le contraire de ce que l'utilisateur demande, qui ne fait que polluer la poste.
Vadim
0

Ceci est mis à jour pour fonctionner sur Apache 2.4:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

Le seul changement par rapport à Michael est de supprimer le [NC], ce qui produit l'erreur "AH00665":

L'option NoCase pour le modèle non-regex '-f' n'est pas prise en charge et sera ignorée

William Entriken
la source
La réponse précédente n'avait pas besoin de "mise à jour pour fonctionner sur Apache 2.4". L '"avertissement" que vous citez (AH00665) se rapporte à une directive différente (par exemple, si vous aviez quelque chose comme ça RewriteCond %{REQUEST_FILENAME} !-f [NC]). Le NCdrapeau fait peu de différence dans ce qui précède, cependant, la raison pour laquelle le NCdrapeau doit être utilisé ici est d'attraper la petite fraction du trafic de bot qui envoie (incorrectement) un nom d'hôte en majuscule.
MrWhite
0

Ajouté si localhost, ignore la redirection (à des fins de développement dans un environnement local). Si ce n'est pas localhost ET (pas https OU c'est www), redirigez vers https et non www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Jeaf Gilbert
la source
Veuillez élaborer votre code afin que l'OP comprenne comment cela répond à la question.
RyanNerd
-2

Bonjour, vous pouvez utiliser les règles suivantes sur votre fichier htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Chirag Parekh
la source
La question demande une solution "générique" qui n'inclut pas le nom de domaine. Votre solution fait également tout le contraire de ce qui est demandé dans la question (non www à www, plutôt que www à non www) sans explication.
MrWhite