.htaccess rewrite per reindirizzare l'URL radice nella sottodirectory


246

Provare a ottenere

www.example.com

per andare direttamente a

www.example.com/store

Ho provato più bit di codice e nessuno funziona.

Cosa ho provato:

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]

Che cosa sto facendo di sbagliato?

Risposte:


275

È possibile utilizzare una regola di riscrittura che utilizza ^ $ per rappresentare la radice e riscriverla nella directory / store, in questo modo:

RewriteEngine On
RewriteRule ^$ /store [L]

6
RewriteRule ^ /? $ /Index.do [R]
barclay

2
^ / $ non sembra mai corrispondere, quindi immagino ^ /? $ non è necessario.
NateS,

È possibile quindi mostrare l'URL completo e continuare a elaborare le regole? Nel mio caso, riscrivo alcuni URL in modo che siano belli. Questo mantiene l'URL esempio.com - Vorrei esempio.com/store e quindi continuare con altre riscritture.
gin93r,

Funziona bene anche per me.
Jitesh Sojitra

1
Di recente ho dedicato molto tempo al debug del perché questo non funzionasse su un sito in Ubuntu Apache 2.4.7. La riscrittura del debug ha mostrato che la regola è stata colpita e ha generato un REDIRECT INTERNO. Quindi sembrò semplicemente parcheggiarlo e cercare una pagina indice. Si scopre che se mod_dir è abilitato E c'è una pagina indice candidata nella directory, allora sovrascrive mod_rewrite, A MENO CHE non si imposti: DirectoryCheckHandler On
Gerrit

142

Sono rimasto sorpreso dal fatto che nessuno abbia menzionato questo:

RedirectMatch ^/$ /store/

Fondamentalmente, reindirizza la radice e solo l'URL radice. La risposta ha avuto origine da questo link


3
grazie, questo ha funzionato benissimo per me con una regola già esistente. nessun conflitto.
scienziato

1
Questo funziona perfettamente. Inoltre, copre sia http che https.
Sayem Shafayet,

3
E questo per il reindirizzamento 301:RedirectMatch 301 ^/$ /store/
Andrea

Sì, è più semplice che con la riscrittura. Grazie!
Orden,

2
@Andrea E questo per 302 reindirizzamenti temporanei: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

Prova questo:

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

Se desideri un reindirizzamento esterno (che induca il browser in visita a mostrare l'URL reindirizzato), imposta anche qui il Rflag:

RewriteRule ^$ /store [L,R=301]

4
Funzionava magnificamente. Sia sample.com che www.sample.com reindirizzano a www.sample.com/store. Questo è proprio quello che volevo. Grazie Gumbo e tutti quelli che hanno risposto. Ho imparato molto leggendo le tue risposte e apprezzo il feedback.

1
Sono curioso, questo mostrerà www.example.comcome URI dopo il reindirizzamento? In caso contrario, come sarebbe cambiato per farlo?
stefmikhail,

1
♦ - E perché la tua soluzione sarebbe migliore di Sander in basso? Ho notato che la tua riga finale è la stessa, ma se è tutto ciò che è necessario, perché includere il RewriteConde il primo RewriteRule?
stefmikhail,

se si utilizza questo codice, è possibile digitare il browser exmple.com/../aboveSubDir?

@GamErix Questo sarebbe risolto /aboveSubDirdal browser o dal server.
Gumbo,

79

Ecco cosa ho usato per reindirizzare a una sottodirectory. Ciò è stato fatto in modo invisibile e consente comunque attraverso richieste che corrispondono a un file esistente o altro.

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]

Cambia site.com e subdir con i tuoi valori.


Funziona come previsto! Grande!
Kachar,

la home page era "invisibile" ... ma quando faccio clic su un collegamento il nome del sottodirectory viene visualizzato nella barra degli indirizzi ... esiste un modo per impedire che il nome del sottodirectory venga visualizzato?
dsdsdsdsd,

4
fa solo root - non fa sub directory
php-b-grader

3
Per me dà "Errore interno del server": /
Pithikos

1
Grazie mille, non sai da quanto tempo cerco esattamente questo.
Base Desire

26

Per impostare un reindirizzamento invisibile dalla radice alla sottocartella, puoi usare la seguente RewriteRule in /root/.htaccess:

RewriteEngine on

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

La regola sopra reindirizzerà internamente il browser da:

per

E

per

mentre il browser rimarrà nella cartella principale.


1
Questa dovrebbe essere la risposta accettata ... La RewriteRule insieme (come suggerito in alcune altre risposte) provoca un reindirizzamento infinito, poiché / sottocartella viene reindirizzata a / sottocartella / sottocartella, ecc ... RewriteCond% {REQUEST_URI}! ^ / Sottocartella fa in modo che se un URL è già reindirizzato, non è fatto di nuovo
patrick

21

Un'altra alternativa se si desidera riscrivere l'URL e nascondere l'URL originale:

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

Con questo, se ad esempio digiti http://www.example.com/product.php?id=4, aprirà il file in modo trasparente http://www.example.com/store/product.php?id=4ma senza mostrare all'utente l'URL completo.


2
Aggiungi QSA(query string append) a [L]( [L, QSA]) se desideri trasferire le stringhe di query all'URL riscritto.
devios1

@chaiguy grazie per il suggerimento, ma sul mio server ha funzionato senza QSA (ma sono d'accordo che probabilmente è meglio aggiungere QSA). Forse è a causa di una configurazione speciale del mio server Apache?
Gaborous,

1
Questo metodo per me, example.com mostra i contenuti di example.com/store in modo trasparente ma example.com/test reindirizza a example.com/store/test, mostrando l'URL
Geoffrey Hale

14

Questa sembrava la soluzione più semplice:

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

Stavo ottenendo loop di reindirizzamento con alcune delle altre soluzioni.


2
questo non nasconde la directory
php-b-grader

8

Non capisco la tua domanda ...

Se desideri reindirizzare ogni richiesta a una sottocartella:

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

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

Se si desidera reindirizzare a una sottocartella con il nome di dominio

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

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

Mi piace il tuo codice ([^\.]+\.[^\.]+)$per riservare il dominio come nome della sottocartella.
Chetabahana,

6

Ho scoperto che per evitare il reindirizzamento circolare, è importante limitare l'ambito del reindirizzamento alla directory principale. Avrei usato:

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

6

La maggior parte delle soluzioni di cui sopra sono corrette ma mancano tutte della trasparenza del reindirizzamento.

Nel mio caso, visitando www.example.com volevo essere reindirizzato alla sottodirectory / store ma senza aggiornare l'URL a www.example.com/store . (tutto quello che voglio è ottenere il codice della pagina da quella directory). In tal caso, la soluzione seguente funziona perfettamente.

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

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


Cosa devo cambiare se avessi bisogno che www.example.com fosse reindirizzato a www.othersite.com/store senza aggiornare l'URL? Ho provato ma non sono riuscito ad adattare il tuo codice
passaggi

Ho provato a cambiare l'ultima riga in RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]ma aggiorna l'URL
passaggi

Tutto ciò che serve è sostituire le parole examplee store.
Mahmoud Zalt,

Non ho spiegato abbastanza bene. Possiedo example.come otherpage.comdomini. Quando visito, example.comdesidero che i contenuti otherpage.com/subfoldervengano visualizzati, senza aggiornare l'URL
passaggi

Bene, la mia risposta sopra non lo fa. Prova a pubblicare una nuova domanda.
Mahmoud Zalt,


4

Precedentemente uso il seguente codice che funziona correttamente per reindirizzare l'URL di root di ciascuno dei miei domini / sottodomini alle loro sottodirectory di corrispondenza che sono denominate esattamente come sotto / dominio stesso come di seguito:

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]

Tuttavia, quando voglio aggiungere altri sottotitoli o domini, dovrà essere aggiunto nel codice sopra. Dovrebbe essere molto più conveniente semplificarlo per funzionare come jolly (*) come di seguito:

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

Pertanto, ogni volta che vengono aggiunti altri sottodomini / domini purché il nome del sottodominio abbia un prefisso sub (come: sub3.domain1.com, sub1.domain3.com ecc.) Il codice rimarrà valido.


3

Penso che i problemi principali con il codice che hai pubblicato siano:

  • la prima riga corrisponde su un host che inizia con rigorosamente sample.com, quindi www.sample.com non corrisponde.

  • la seconda riga vuole almeno un personaggio, seguito da www.sample.com che non corrisponde (perché sei sfuggito alla prima w?)

  • nessuna delle regole incluse reindirizza all'URL specificato nell'obiettivo (inoltre, il campione è errato come samle, ma questo è irrilevante).

Per riferimento, ecco il codice che hai attualmente:

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]

2

Un po 'googling, mi dà questi risultati:

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

Questo reindirizzerà qualsiasi tentativo di accedere a un file chiamato index.something nella tua sottocartella, indipendentemente dal fatto che il file esista o meno.

Oppure prova questo:

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

Non ho fatto molto reindirizzamento nel file .htaccess, quindi non sono sicuro che funzionerà.


2

Due soluzioni possibili per raggiungere questo obiettivo sono: 1. Creare un .htaccessfile nella cartella principale come sotto (basta sostituire example.com e my_dir con i valori corrispondenti):

<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. Utilizza RedirectMatch per reindirizzare l'URL principale "/" su un'altra cartella o URL,

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


1

prova a usare le righe sotto in htaccess

Nota: potrebbe essere necessario controllare qual è il nome di default.html

default.html è il file che si carica per impostazione predefinita nella cartella principale.

RewriteEngine

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


0

aggiungi semplicemente questo codice nel tuo file .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>

0

Risponderò alla domanda originale non indicando un'altra possibile sintassi (ce ne sono molte tra le altre risposte) ma sottolineando qualcosa che una volta ho dovuto affrontare, che mi ha impiegato un po 'di tempo per capire:

What am I doing wrong?

È possibile che% {HTTP_HOST} non venga popolato correttamente o affatto. Anche se, ho visto che si verificano solo in una macchina su un host condiviso, con qualche apache 2.2 personalizzato, è comunque una possibilità.


0

Questo proverà il subdir se il file non esiste nella radice. Ne ho avuto bisogno quando ho spostato un sito Web di base .html che prevede di essere eseguito a livello di root e trasferito in un sottodir. Funziona solo se tutti i file sono piatti (nessun trucco .htaccess nel sottodirizzo possibile). Utile per cose collegate come file css e 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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.