web-dev-qa-db-fra.com

Htaccess générique rediriger www en non-www

Je voudrais rediriger www.example.com vers 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, y a-t-il un moyen de faire cela de manière générique sans coder en dur le nom de domaine?

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

Identique à Michael sauf que celui-ci fonctionne: P

856
Ben

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]
106
Andron

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]
71
Dmitriy

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

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

J'ai eu cette réponse ici: https://serverfault.com/questions/120488/redirect-url-within-Apache-virtualhost/120507#120507

44
William Denniss

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 no-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'indicateur NE pour empêcher Apache d'échapper à la chaîne de requête. Sans cet indicateur, Apache changera l'URL demandée http://www.example.com/?foo%20bar en http://www.example.com/?foo%2250bar

33
Salman A
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ http://%1/$1 [R]

La RewriteCond capture tout dans la variable HTTP_Hostaprès le www. et l'enregistre dans %1.

La RewriteRule capture l'URL sans le / initial et l'enregistre dans $1.

11
Michael Cramer

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 au début de l'URL, puis retirons le "www."

7
Greg

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

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

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

S'il vous plaît laissez-moi 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]
6
Gregor Macgregor

Je trouve qu'il peut y avoir beaucoup de désinformation sur les redirections htaccess. Tout d'abord, assurez-vous que votre site fonctionne sous Unix sous Apache et non sur un hôte Windows si vous prévoyez que ce code fonctionnera.

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 afin que le rendu soit correct dans cette fenêtre.)

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

6
Htaccess Redirect

Pour ceux qui doivent pouvoir 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]

Je suis sûr que vous ajoutez ceci au fichier suivant

/site/location/.htaccess 
3
Rick
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Pour le sous-dossier

3
pelajar

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]
3

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

Il vous suffit de placer les lignes de code suivantes dans votre fichier principal .htaccess. Dans les deux cas, remplacez 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 un non-www

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

changez DOT en =>. !!!

3
Rohallah Hatami
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 www sur http et https, utilisez les éléments suivants:

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 le faire en utilisant une directive Redirect avec if,

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

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";

Or .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);
        }
    }
});
2
antimalwareprogram

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

J'ai trouvé cette autre règle dans mon fichier .htaccess qui cause ceci, 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]
2
Luke

La réponse sélectionnée et de nombreuses autres solutions ici ont laissé tomber la partie de l'URL après /, donc fondamentalement, elle est toujours redirigée vers le domaine principal, du moins pour moi.

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

La seule façon dont je l'ai fait fonctionner ...

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

Si vous forcez www. en url ou en forçant ssl prototcol, puis essayez d’utiliser les variantes possibles du fichier htaccess, telles que:

 RewriteEngine On 
 RewriteBase /[.____._rev
### Force WWW ### 
 
 RewriteCond% {HTTP_Host} ^ exemple\.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 à partir de 256.251.0.139 
 Refuser à partir de 199.127.0.259 
1
mystique

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 vs Michael's consiste à supprimer le [NC], qui génère l'erreur "AH00665":

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

0

Je ne sais pas pourquoi tu veux enlever www. Mais la version inversée 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 le suivant: si vous avez quelque chose comme test.whattimein.com ou tout autre environnement (environnement de développement/test), il ne sera pas redirigé vers l’environnement d’origine.

0
local