.htaccess przepisz, aby przekierować główny adres URL do podkatalogu


246

Próbować dostać

www.example.com

przejść bezpośrednio do

www.example.com/store

Próbowałem wielu bitów kodu i nic nie działa.

Co próbowałem:

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]

Co ja robię źle?

Odpowiedzi:


275

Możesz użyć reguły przepisywania, która używa ^ $ do reprezentowania katalogu głównego i przepisać ją do katalogu / store, w następujący sposób:

RewriteEngine On
RewriteRule ^$ /store [L]

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

2
^ / $ nigdy nie wydaje się pasować, więc chyba ^ /? $ nie jest konieczne.
NateS

Czy można wtedy wyświetlić pełny adres URL i kontynuować przetwarzanie reguł? W moim przypadku przepisuję niektóre adresy URL, aby były ładne. Utrzymuje to adres URL example.com - chciałbym, aby example.com/store, a następnie kontynuować inne przepisywanie.
gin93r

Dla mnie też działa dobrze.
Jitesh Sojitra

1
Niedawno spędziłem dużo czasu na debugowaniu, dlaczego to nie działa na stronie w Ubuntu Apache 2.4.7. Debugowanie przepisywania pokazało trafienie reguły i generowanie WEWNĘTRZNEJ REEDIRECT. Potem wydawało się, że po prostu to zaparkuje i poszuka strony indeksu. Okazuje się, że jeśli mod_dir jest włączony i znajduje się kandydat strona indeks w reż następnie zastępuje on mod_rewrite, chyba że ustawisz: DirectoryCheckHandler On
Gerrit

142

Byłem zaskoczony, że nikt o tym nie wspominał:

RedirectMatch ^/$ /store/

Zasadniczo przekierowuje katalog główny i tylko adres URL katalogu głównego. Odpowiedź pochodzi z tego linku


3
dzięki, działało to świetnie dla mnie z już istniejącą regułą. bez konfliktu.
naukowiec

1
Ten działa idealnie. Ponadto obejmuje zarówno http, jak i https.
Sayem Shafayet

3
A to dla przekierowania 301:RedirectMatch 301 ^/$ /store/
Andrea

Tak, łatwiej jest to przepisać. Dzięki!
Orden

2
@Andrea A to za tymczasowe przekierowanie 302: RedirectMatch 302 ^ / $ / store /
Faizan Anwer Ali Rupani

108

Spróbuj tego:

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

Jeśli chcesz, aby zewnętrzne przekierowanie (które powoduje, że przeglądarka wyświetlała przekierowany adres URL), ustaw Rtam również flagę:

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

4
To działało pięknie. Zarówno sample.com, jak i www.sample.com przekierowują na www.sample.com/store. Właśnie tego chciałem. Dziękuję Gumbo i wszystkim, którzy odpowiedzieli. Nauczyłem się dużo czytając twoje odpowiedzi i doceniam opinie.

1
Jestem ciekawy, czy www.example.compo przekierowaniu będzie on wyświetlany jako identyfikator URI? Jeśli nie, to jak by to zmienić?
stefmikhail

1
♦ - A dlaczego twoje rozwiązanie byłoby lepsze niż Sander na dole? Widzę, że twoja ostatnia linia jest taka sama, ale jeśli to wszystko, co jest potrzebne, dlaczego warto dołączyć RewriteCondpierwszą i pierwszą RewriteRule?
stefmikhail

jeśli użyjesz tego kodu, czy możesz wpisać w przeglądarce exmple.com/../aboveSubDir?

@GamErix Problem zostanie rozwiązany /aboveSubDirprzez przeglądarkę lub serwer.
Gumbo

79

Oto, co zwykłem przekierowywać do podkatalogu. To zrobiło to niewidocznie i nadal pozwala na żądania pasujące do istniejącego pliku lub cokolwiek innego.

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]

Zmień site.com i podkatalog ze swoimi wartościami.


Działa zgodnie z oczekiwaniami! Wspaniały!
kachar

strona główna była „ukryta” ... ale kiedy kliknę link, nazwa podkatalogu pojawi się na pasku adresu ... czy istnieje sposób, aby zapobiec wyświetlaniu nazwy podkatalogu?
dsdsdsdsd

4
robi tylko root - nie robi podkatalogów
php-b-grader

3
Dla mnie daje „Wewnętrzny błąd serwera”: /
Pithikos

1
Dziękuję bardzo, nie wiesz dokładnie, jak długo dokładnie tego szukałem.
Base Desire

26

Aby ustawić niewidoczne przekierowanie z katalogu głównego do podfolderu, możesz użyć następującej reguły RewriteRule w katalogu /root/.htaccess:

RewriteEngine on

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

Powyższa reguła wewnętrznie przekieruje przeglądarkę z:

do

I

do

podczas gdy przeglądarka pozostanie w folderze głównym.


1
To powinna być zaakceptowana odpowiedź ... RewriteRule wzdłuż (jak zasugerowano w niektórych innych odpowiedziach) powoduje nieskończone przekierowanie, ponieważ / subfolder jest przekierowywany do / subfolder / subfolder itp. ... RewriteCond% {REQUEST_URI}! ^ / Subfolder upewnia się, że jeśli adres URL jest już przekierowany, to się nie powtórzy
Patrick

21

Inna alternatywa, jeśli chcesz przepisać adres URL i ukryć oryginalny adres URL:

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

Dzięki temu, jeśli na przykład wpiszesz http://www.example.com/product.php?id=4, przejrzyście otworzy plik w, http://www.example.com/store/product.php?id=4ale bez pokazywania użytkownikowi pełnego adresu URL.


2
Dodaj QSA(dołącz ciąg zapytania) do [L]( [L, QSA]), jeśli chcesz, aby ciągi zapytania zostały przeniesione do przepisanego adresu URL.
devios1 10.10.2013

@chaiguy dziękuję za podpowiedź, ale na moim serwerze działało bez QSA (ale zgadzam się, że prawdopodobnie lepiej jest dołączyć QSA). Może to z powodu specjalnej konfiguracji mojego serwera Apache?
ponury

1
Ta metoda dla mnie example.com wyświetla zawartość z example.com/store w sposób przejrzysty, ale example.com/test przekierowuje do example.com/store/test, pokazując adres URL
Geoffrey Hale

14

To wydawało się najprostszym rozwiązaniem:

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

Dostawałem pętle przekierowań z niektórymi innymi rozwiązaniami.


2
ten nie ukrywa katalogu
php-b-grader

8

Nie rozumiem twojego pytania ...

Jeśli chcesz przekierować każde żądanie do podfolderu:

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

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

Jeśli chcesz przekierować do podfolderu, który ma nazwę domeny

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

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

Podoba mi się twój kod, ([^\.]+\.[^\.]+)$aby zarezerwować domenę jako nazwę podfolderu.
Chetabahana

6

Odkryłem, że w celu uniknięcia cyklicznego przekierowywania ważne jest ograniczenie zakresu przekierowania do katalogu głównego. Użyłbym:

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

6

Większość powyższych rozwiązań jest poprawna, ale wszystkie brakuje przejrzystości przekierowania.

W moim przypadku odwiedzając witrynę www.example.com , chciałem zostać przekierowany do podkatalogu / sklepu ale bez aktualizacji adresu URL do www.example.com/store . (chcę tylko uzyskać kod strony z tego katalogu). W takim przypadku poniższe rozwiązanie działa idealnie.

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

źródło: http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory


Co powinienem zmienić, jeśli potrzebowałem przekierowania www.example.com na www.othersite.com/store bez aktualizacji adresu URL? Próbowałem, ale nie byłem w stanie dostosować twojego kodu
kroki

Próbowałem zmienić ostatni wiersz na, RewriteRule ^(.*)$ http://otherpage.com/subfolder/$1 [L]ale aktualizuje on adres URL
kroki

Wszystko, czego potrzebujesz, to zastąpić słowa examplei store.
Mahmoud Zalt

Nie wyjaśniłem całkiem dobrze. Posiadam example.comi otherpage.comdomeny. Kiedy odwiedzam example.com, chcę, aby treść otherpage.com/subfolderbyła wyświetlana, bez aktualizacji adresu URL
kroki

Cóż, moja powyższa odpowiedź tego nie robi. Spróbuj opublikować nowe pytanie.
Mahmoud Zalt,


4

Poprzednio korzystam z następującego kodu, który działa poprawnie, aby przekierować główny adres URL każdej z moich domen / subdomen do ich podkatalogów korespondencyjnych, które są nazwane dokładnie jako sub / domena, którą samodzielnie:

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]

Jednak gdy chcę dodać kolejne subskrypcje lub domeny, trzeba będzie dodać je w powyższym kodzie. O wiele wygodniej jest uprościć go, aby działał jak symbol wieloznaczny (*), jak poniżej:

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

Tak więc za każdym razem, gdy dodawane są inne subdomeny / domeny, o ile nazwa subdomeny ma prefiks sub (np. Sub3.domain1.com, sub1.domain3.com itd.), Kod pozostanie ważny.


3

Myślę, że główne problemy z opublikowanym kodem to:

  • pierwsza linia pasuje do hosta zaczynającego się od ściśle sample.com, więc www.sample.com nie pasuje.

  • druga linia wymaga co najmniej jednego znaku, po którym następuje www.sample.com, który również nie pasuje (dlaczego uniknąłeś pierwszego w?)

  • żadna z zawartych reguł nie przekierowuje do adresu URL określonego w celu (plus, próbka jest zapisana jako próbka, ale to nie ma znaczenia).

Dla odniesienia, oto kod, który obecnie posiadasz:

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

Trochę google, daje mi te wyniki:

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

Spowoduje to przekierowanie każdej próby dostępu do pliku o nazwie index.something do twojego podfolderu, niezależnie od tego, czy plik istnieje, czy nie.

Lub spróbuj tego:

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

Nie zrobiłem wiele przekierowań w pliku .htaccess, więc nie jestem pewien, czy to zadziała.


2

Istnieją dwa sposoby na rozwiązanie tego problemu: 1. Utwórz .htaccessplik w folderze głównym jak poniżej (wystarczy zastąpić example.com i mój_katalog odpowiednimi wartościami):

<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. Użyj narzędzia RedirectMatch, aby przekierować tylko główny adres URL „/” do innego folderu lub adresu URL,

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


1

spróbuj użyć poniżej linii w htaccess

Uwaga: może być konieczne sprawdzenie, jaka jest nazwa pliku default.html

default.html to plik ładowany domyślnie w folderze głównym.

RewriteEngine

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


0

po prostu dodajesz ten kod do pliku .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

Odpowiem na pierwotne pytanie, nie wskazując innej możliwej składni (istnieje wiele innych odpowiedzi), ale wskazując coś, z czym kiedyś miałem do czynienia, zajęło mi to trochę czasu, aby wymyślić:

What am I doing wrong?

Istnieje możliwość, że% {HTTP_HOST} nie jest wypełniany poprawnie lub wcale. Chociaż widziałem, że występuje to tylko na jednej maszynie na wspólnym hoście, z jakimś niestandardowym łatanym apache 2.2, jest to jednak możliwe.


0

Spowoduje to wypróbowanie podkatalogu, jeśli plik nie istnieje w katalogu głównym. Potrzebowałem tego, ponieważ przeniosłem podstawową stronę .html, która oczekuje na uruchomienie na poziomie roota i wypchnąłem ją do podkatalogu. Działa tylko wtedy, gdy wszystkie pliki są płaskie (brak możliwości .htaccess w podkatalogu możliwe). Przydatne w przypadku powiązanych rzeczy, takich jak pliki css i 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]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.