Réécriture du .htaccess pour rediriger l'URL racine vers le sous-répertoire

246

Essayer d'obtenir

www.example.com

aller directement à

www.example.com/store

J'ai essayé plusieurs bits de code et aucun ne fonctionne.

Ce que j'ai essayé:

Options +FollowSymlinks
RewriteEngine on

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

RewriteCond %{HTTP_HOST} ^(.+)\www.example\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]

Qu'est-ce que je fais mal?

Willi Mentzel
la source

Réponses:

275

Vous pouvez utiliser une règle de réécriture qui utilise ^ $ pour représenter la racine et la réécrire dans votre répertoire / store, comme ceci:

RewriteEngine On
RewriteRule ^$ /store [L]

la source
6
RewriteRule ^ /? $ /Index.do [R]
barclay
2
^ / $ ne semble jamais correspondre donc je suppose que ^ /? $ n'est pas nécessaire.
NateS
Est-il possible d'afficher ensuite l'URL complète et de poursuivre le traitement des règles? Dans mon cas, je réécris certaines URL pour qu'elles soient jolies. Cela conserve l'url example.com - je voudrais exemple.com/store, puis continuer avec d'autres réécritures.
gin93r
Fonctionne bien pour moi aussi.
Jitesh Sojitra
1
Récemment, j'ai passé beaucoup de temps à déboguer pourquoi cela ne fonctionnait pas sur un site dans Ubuntu Apache 2.4.7. Le débogage de réécriture a montré que la règle était atteinte et générait un REDIRECT INTERNE. Ensuite, il a semblé simplement garer cela et rechercher une page d'index. Il s'avère que si mod_dir est activé ET qu'il y a un candidat à la page d'index dans le répertoire, il remplace le mod_rewrite, SAUF si vous avez défini: DirectoryCheckHandler On
Gerrit
142

J'ai été surpris que personne n'ait mentionné cela:

RedirectMatch ^/$ /store/

Fondamentalement, il redirige la racine et uniquement l'URL racine. La réponse provient de ce lien

Dio Phung
la source
3
merci, cela a très bien fonctionné pour moi avec une règle déjà existante. pas de conflit.
scientifique
1
Celui-ci fonctionne parfaitement. En outre, il couvre à la fois http et https.
Sayem Shafayet
3
Et ceci pour la redirection 301:RedirectMatch 301 ^/$ /store/
Andrea
Oui, c'est plus simple qu'avec la réécriture. Merci!
Orden
2
@Andrea Et ceci pour la redirection temporaire 302: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani
108

Essaye ça:

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

Si vous souhaitez une redirection externe (qui fait que le navigateur visiteur affiche l'URL redirigée), définissez-y également l' Rindicateur:

RewriteRule ^$ /store [L,R=301]
Gombo
la source
4
Cela a très bien fonctionné. Les exemples sample.com et www.sample.com redirigent vers www.sample.com/store. C'est juste ce que je voulais. Merci Gumbo et tous ceux qui ont répondu. J'ai beaucoup appris en lisant vos réponses et j'apprécie les commentaires.
1
Je suis curieux, cela apparaîtra-t-il www.example.comcomme l'URI après la redirection? Sinon, comment serait-il changé pour le faire?
stefmikhail
1
♦ - Et pourquoi votre solution serait-elle meilleure que celle de Sander ci-dessous? Je remarque que votre dernière ligne est la même, mais si c'est tout ce qui est nécessaire, pourquoi inclure la RewriteCondet la première RewriteRule?
stefmikhail
si ce code est utilisé, pouvez-vous taper dans votre navigateur exmple.com/../aboveSubDir?
@GamErix Cela serait résolu /aboveSubDirpar le navigateur ou par le serveur.
Gumbo
79

Voici ce que j'ai utilisé pour rediriger vers un sous-répertoire. Cela l'a fait de manière invisible et permet toujours des requêtes qui correspondent à un fichier existant ou autre.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteCond %{REQUEST_URI} !^/subdir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /subdir/$1
RewriteCond %{HTTP_HOST} ^(www.)?site.com$
RewriteRule ^(/)?$ subdir/index.php [L]

Changez site.com et subdir avec vos valeurs.

Jage
la source
Fonctionne comme prévu! Génial!
kachar
la page d'accueil était «furtive» ... mais une fois que je clique sur un lien, le nom du sous-répertoire apparaît dans la barre d'adresse ... est-il possible d'empêcher le nom du sous-répertoire de s'afficher?
dsdsdsdsd
4
ne fait que root - ne fait pas de sous-répertoires
php-b-grader
3
Pour moi, cela donne "Erreur de serveur interne": /
Pithikos
1
Merci beaucoup, vous ne savez pas depuis combien de temps je recherche cela.
Base Desire
26

Pour définir une redirection invisible de la racine vers le sous-dossier, vous pouvez utiliser la RewriteRule suivante dans /root/.htaccess:

RewriteEngine on

RewriteCond %{REQUEST_URI} !^/subfolder
RewriteRule ^(.*)$ /subfolder/$1 [NC,L]

La règle ci-dessus redirigera en interne le navigateur depuis:

à

Et

à

tandis que le navigateur restera sur le dossier racine.

starkeen
la source
1
Cela devrait être la réponse acceptée ... Le RewriteRule le long (comme suggéré dans certaines autres réponses) provoque une redirection infinie, car / subfolder est redirigé vers / subfolder / subfolder, etc ... RewriteCond% {REQUEST_URI}! ^ / Subfolder s'assure que si une URL est déjà redirigée, ce n'est pas fait à nouveau
patrick
21

Une autre alternative si vous souhaitez réécrire l'URL et masquer l'URL d'origine:

RewriteEngine on
RewriteRule ^(.*)$ /store/$1 [L]

Avec cela, si vous tapez par exemple http://www.example.com/product.php?id=4, il ouvrira le fichier de manière transparente à http://www.example.com/store/product.php?id=4mais sans montrer à l'utilisateur l'URL complète.

généreux
la source
2
Ajoutez QSA(chaîne de requête ajoutée) à [L]( [L, QSA]) si vous souhaitez que les chaînes de requête soient transférées dans l'URL réécrite.
devios1
@chaiguy merci pour l'astuce, mais sur mon serveur, cela a fonctionné sans QSA (mais je suis d'accord, il est probablement préférable d'ajouter QSA). C'est peut-être à cause d'une configuration spéciale de mon serveur apache?
gaborous
1
Cette méthode pour moi, example.com affiche le contenu de example.com/store de manière transparente mais example.com/test redirige vers example.com/store/test, montrant l'url
Geoffrey Hale
14

Cela semblait la solution la plus simple:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]

J'obtenais des boucles de redirection avec certaines des autres solutions.

user1801050
la source
2
celui-ci ne cache pas le répertoire
php-b-grader
8

Je ne comprends pas ta question ...

Si vous souhaitez rediriger chaque demande vers un sous-dossier:

RewriteRule ^(.*)$ shop/$1 [L,QSA]

http://www.example.com/* -> wwwroot/store/*

Si vous souhaitez rediriger vers un sous-dossier qui a le nom de domaine

RewriteCond %{HTTP_HOST} ([^\.]+\.[^\.]+)$
RewriteRule ^(.*)$ %1/$1 [L,QSA]

http://www.example.com/* -> wwwroot/example.com/*
inf3rno
la source
J'aime votre code ([^\.]+\.[^\.]+)$pour réserver le domaine comme nom de sous-dossier.
Chetabahana
6

J'ai constaté qu'afin d'éviter la redirection circulaire, il est important de limiter la portée de la redirection vers le répertoire racine. J'aurais utilisé:

RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule (.*) http://www.example.com/store [R=301,L]
Nir O.
la source
6

La plupart des solutions ci-dessus sont correctes mais il leur manque toutes la transparence de la redirection.

Dans mon cas, lorsque je visitais www.example.com, je voulais être redirigé vers le sous - répertoire / magasin mais sans mettre à jour l'URL vers www.example.com/store . (tout ce que je veux, c'est obtenir le code de page de ce répertoire). Si tel est votre cas, la solution ci-dessous fonctionne parfaitement.

RewriteEngine on
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{REQUEST_URI} ^/$
RewriteRule ^(.*)$ /store/$1 [L]

source: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory

Mahmoud Zalt
la source
Que dois-je changer si j'ai besoin que www.example.com soit redirigé vers www.othersite.com/store sans mettre à jour l'URL? J'ai essayé, mais je n'ai pas pu adapter votre code
étapes
J'ai essayé de changer la dernière ligne en RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]mais elle met à jour l'URL
étapes
Il vous suffit de remplacer les mots exampleet store.
Mahmoud Zalt du
Je n'ai pas bien expliqué. Je possède example.comet otherpage.comdomaines. Lorsque je visite, example.comje veux que le contenu de otherpage.com/subfoldersoit affiché, sans mettre à jour l'URL
étapes
Eh bien, ma réponse ci-dessus ne fait pas cela. Essayez de poster une nouvelle question.
Mahmoud Zalt du
4

Auparavant, j'utilise le code suivant qui fonctionne correctement pour rediriger l'URL racine de chacun de mes domaines / sous-domaines vers leurs sous-répertoires de correspondance qui sont nommés exactement comme le sous-domaine lui-même comme ci-dessous:

RewriteCond %{HTTP_HOST} ^sub1.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain1.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain1.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub1.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub1.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

RewriteCond %{HTTP_HOST} ^sub2.domain2.com
RewriteCond %{REQUEST_URI} !subs/sub2.domain2.com/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Cependant, lorsque je veux ajouter un autre sous-domaine ou domaine, il devra être ajouté dans le code ci-dessus. Il devrait être beaucoup plus pratique de le simplifier pour qu'il fonctionne comme un caractère générique (*) comme ci-dessous:

RewriteCond %{HTTP_HOST} ^sub
RewriteCond %{REQUEST_URI} !/subs/
RewriteRule ^(.*)$ subs/%{HTTP_HOST}/$1 [L,QSA]

Ainsi, chaque fois qu'un autre sous-domaine / domaine est ajouté tant que le nom du sous-domaine a un préfixe sub (comme: sub3.domain1.com, sub1.domain3.com etc.), le code restera valide.

Chetabahana
la source
3

Je pense que les principaux problèmes avec le code que vous avez publié sont:

  • la première ligne correspond à un hôte commençant strictement par sample.com, donc www.sample.com ne correspond pas.

  • la deuxième ligne veut au moins un caractère, suivie de www.sample.com qui ne correspond pas non plus (pourquoi avez-vous échappé au premier w?)

  • aucune des règles incluses ne redirige vers l'URL que vous avez spécifiée dans votre objectif (en plus, l'échantillon est mal orthographié comme samle, mais ce n'est pas pertinent).

Pour référence, voici le code que vous avez actuellement:

Options +FollowSymlinks
RewriteEngine on

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

RewriteCond %{HTTP_HOST} ^(.+)\www.sample\.com$
RewriteRule ^/(.*)$ /samle/%1/$1 [L]
Artem Russakovskii
la source
2

Un peu sur Google, me donne ces résultats:

RewriteEngine sur l'
index RewriteBase /
RewriteRule ^. (. *)? $ Http://domain.com/subfolder/ [r = 301]

Cela redirigera toute tentative d'accès à un fichier nommé index.something vers votre sous-dossier, que le fichier existe ou non.

Ou essayez ceci:

RewriteCond% {HTTP_HOST}! ^ Www.sample.com $ [NC]
RewriteRule ^ (. *) $% {HTTP_HOST} / samlse / $ 1 [R = 301, L]

Je n'ai pas fait beaucoup de redirection dans le fichier .htaccess, donc je ne sais pas si cela fonctionnera.

Steven
la source
2

Les deux solutions possibles pour y parvenir sont les suivantes: 1. Créez un .htaccessfichier dans le dossier racine comme sous (remplacez simplement example.com et my_dir par vos valeurs correspondantes):

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/my_dir/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_dir/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ my_dir/index.php [L] 
</IfModule>
  1. Utilisez RedirectMatch pour rediriger uniquement l'URL racine «/» vers un autre dossier ou URL,

    RedirectMatch ^ / $ http://www.example.com/my_dir

Mushtaq Hussain
la source
1

essayez d'utiliser les lignes ci-dessous dans htaccess

Remarque: vous devrez peut-être vérifier le nom du fichier default.html

default.html est le fichier qui se charge par défaut dans le dossier racine.

RewriteEngine

Redirect /default.html http://example.com/store/

Abouasy
la source
0

vous venez d'ajouter ce code dans votre fichier .htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /folder/index.php [L]
</IfModule>
karthikeyan ganesan
la source
0

Je répondrai à la question d'origine non pas en soulignant une autre syntaxe possible (il y en a beaucoup parmi les autres réponses) mais en soulignant quelque chose que j'ai déjà eu à traiter, qui m'a mis un certain temps à comprendre:

What am I doing wrong?

Il est possible que% {HTTP_HOST} ne soit pas correctement rempli, ou pas du tout. Bien que je n'ai vu que cela se produire dans une seule machine sur un hôte partagé, avec certains apache 2.2 patché personnalisé, c'est néanmoins une possibilité.

Μάκης Παλάσης
la source
0

Cela essaiera le sous-répertoire si le fichier n'existe pas à la racine. J'avais besoin de cela car j'ai déplacé un site Web .html de base qui s'attend à être exécuté au niveau racine et l'ai poussé vers un sous-répertoire. Fonctionne uniquement si tous les fichiers sont plats (pas de supercherie .htaccess dans le sous-répertoire possible). Utile pour les choses liées comme les fichiers css et js.

# Internal Redirect to subdir if file is found there.
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/subdir/%{REQUEST_URI} -s
RewriteRule ^(.*)$ /subdir/$1 [L]
mikeytown2
la source