.htaccess przepisz subdomenę do katalogu

Odpowiedzi:

107

Spróbuj umieścić to w swoim pliku .htaccess:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^sub.domain.com
RewriteRule ^(.*)$ /subdomains/sub/$1 [L,NC,QSA]

Aby uzyskać bardziej ogólną regułę (która działa z każdą subdomeną, a nie tylko sub), zamień ostatnie dwie linie na następującą:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ subdomains/%1/$1 [L,NC,QSA]
Ansari
źródło
3
Rozwiązanie Ansari zadziała, jednak gdy przejdę do http://test.domain.com, adres URL przekieruje mnie do http://test.domain.com/subdomains/test/. Czy to możliwe bez pokazywania /subdomains/test/na końcu?
Erik Djupvik
2
W takim przypadku uważam, że będziesz musiał przyjrzeć się użyciu mod_proxy i określić Pflagę oprócz L.
Ansari,
1
Nie, przekierowuje do http://test.domain.com/subdomains/test/, kiedy chcę, żeby tylko się wyświetlałohttp://test.domain.com/
Erik Djupvik
1
Nie widzę, jak to przekierowuje test.domain.com/subdomains/test- może dzieje się coś innego. Czy możesz dodać RewriteBase /zaraz potem RewriteEngine on? Ponadto, jeśli chcesz, aby był wyświetlany test.domain.com, będziesz musiał użyć mod_proxy i [P]flagi.
Ansari
1
Udało mi się go uruchomić, używając odpowiedzi @ anubhava tutaj: stackoverflow.com/a/22395008/128984
Micah
50

Nie jestem ekspertem od mod_rewrite, często się z tym zmagam, ale zrobiłem to na jednej z moich witryn, może potrzebować innych flag itp. W zależności od okoliczności. Używam tego:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^subdomain\.example\.com$
RewriteCond %{REQUEST_URI} !^/subdomains/subdomain
RewriteRule ^(.*)$ /subdomains/subdomain/$1 [L] 

Wszelkie inne reguły przepisywania dla reszty witryny muszą zostać wprowadzone później, aby zapobiec zakłócaniu przepisywania subdomeny.

Lee Kowalkowski
źródło
Tak bym powiedział. Okazało się, że to ustawienie jest właściwe, tak samo jak moja odpowiedź tutaj .
Chetabahana
5
Jako odniesienie, jeśli ktoś zaczynający się od .htaccesswejdzie na tę stronę (tak jak ja), oprócz stworzenia właściwego .htaccesspliku, aby był on skuteczny, musisz ustawić AllowOverridew swoich VirtualHostustawieniach ( stackoverflow.com/a/22819550/1657502 ) , włącz rewritemoduł Apache, a następnie zrestartuj Apache ( stackoverflow.com/a/5758551/1657502 )
Antonio Vinicius Menezes Medei
To nie zadziała, jeśli używasz www do odwiedzania subdomeny. Rozwiązanie @Minh będzie działać we wszystkich przypadkach.
Rohan Khude
@RohanKhude, czy masz na myśli, że witryny www.example.com i example.com zawierają różne treści? Ponieważ zazwyczaj w przypadku SEO witryna www.example.com powinna wystawiać stałe przekierowanie na example.com lub odwrotnie.
Lee Kowalkowski
1
@RohanKhude www jako subdomena subdomeny jest również czymś, co musiałbyś również zabrać do pracy na poziomie DNS, prawda? Myślę, że Twoje oczekiwanie, że będzie działać dla dowolnej dowolnej subdomeny, jest nieprawidłowe. Odpowiedź Minha ( stackoverflow.com/a/41389905/30945 ) zakłada, że ​​Twoja konfiguracja .htaccess obsługuje 1 i tylko 1 subdomenę, więc jest mniej niezawodna w tym aspekcie. Moje rozwiązanie obsługuje tyle subdomen, ile potrzebujesz, ale tak, musisz jawnie zdefiniować każdą obsługiwaną subdomenę, ale opcjonalny www.prefiks jest prawdopodobnie najlepiej obsługiwany przez przekierowanie niż przepisanie.
Lee Kowalkowski
18

Możesz użyć następującej reguły w .htaccess, aby przepisać subdomenę do podfolderu:

RewriteEngine On

 # If the host is "sub.domain.com"
 RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]
 # Then rewrite any request to /folder
 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

Wyjaśnienie wiersz po wierszu:

  RewriteEngine on

Powyższa linia informuje serwer, aby włączył silnik przepisywania adresów URL.

  RewriteCond %{HTTP_HOST} ^sub.domain.com$ [NC]

Ten wiersz jest warunkiem dla RewriteRule, w którym dopasowujemy do hosta HTTP przy użyciu wzorca wyrażenia regularnego. Warunek mówi, że jeśli host to sub.domain.com, wykonaj regułę.

 RewriteRule ^((?!folder).*)$ /folder/$1 [NC,L]

Reguła pasuje do http://sub.domain.com/foo i wewnętrznie przekierowuje ją na http://sub.domain.com/folder/foo .

Zastąp sub.domain.com nazwą subdomeny, a folder nazwą folderu, do którego chcesz skierować swoją subdomenę.

Amit Verma
źródło
1
To jest dla mnie poprawna odpowiedź - wyjaśnienie, jak się tu dostałem, w następujący sposób. Przybyłem tutaj, szukając starego problemu z przekierowaniem subdomeny, który najwyraźniej zepsuł się, gdy zainstalowałem SSL na głównej stronie TLD. Przekierowanie początkowo nadal próbowało używać TLD głównej witryny i łamało zasady bezpieczeństwa. To, czego potrzebowałem, to utrzymanie subdomeny (która była na zupełnie innej TLD) na tym samym hoście, ale z dala od głównej witryny. Dodanie reguły przepisywania, jak powyżej, umożliwiło mi przekazanie całej subdomeny do folderu hostowanego w głównej witrynie TLD.
Richard Bown,
8

Miałem ten sam problem i znalazłem szczegółowe wyjaśnienie w http://www.webmasterworld.com/apache/3163397.htm

Moje rozwiązanie (zawartość poddomen powinna znajdować się w folderze o nazwie sd_subdomain:

Options +FollowSymLinks -MultiViews

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} subdomain\.domain\.com
RewriteCond $1 !^sd_
RewriteRule (.*) /sd_subdomain/$1 [L]
Pablo Torrecilla
źródło
1
U mnie to nie działa, czy muszę coś skonfigurować w strefie dns domeny?
totoaussi
1
@totoaussi powinieneś utworzyć rekord * A lub rekord A dla każdej subdomeny, wskazujący na ten sam serwer.
Pablo Torrecilla
4

To przekierowuje do tego samego folderu do subdomeny:

.httaccess

RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^\.]+)\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://domain\.com/subdomains/%1
jmsmarcelo
źródło
3

Spróbuj umieścić ten plik .htaccess w folderze subdomeny:

RewriteEngine On

RewriteRule ^(.*)?$ ./subdomains/sub/$1

Przekierowuje do http://domain.com/subdomains/sub/ , gdy chcesz, aby pokazywała tylko http://sub.domain.com/

Minh Trịnh
źródło
Pytanie zostało zadane w 2012 roku i ma 8 odpowiedzi. Czy Twoja odpowiedź jest w tym momencie wartościowa?
ppovoski
To rozwiązanie zadziała, nawet jeśli użyjesz www do odwiedzenia subdomeny
Rohan Khude
2

Przekierowanie katalogu subdomeny:

RewriteCond %{HTTP_HOST} ^([^.]+)\.(archive\.example\.com)$ [NC]
RewriteRule ^ http://%2/%1%{REQUEST_URI} [L,R=301]
Mayank Awasthi
źródło
0

W przypadku każdego żądania subdomeny użyj tego:

RewriteEngine on 
RewriteCond %{HTTP_HOST} !^www\.band\.s\.co 
RewriteCond %{HTTP_HOST} ^(.*)\.band\.s\.co 
RewriteCond %{REQUEST_URI} !^/([a-zA-Z0-9-z\-]+) 
RewriteRule ^(.*)$ /%1/$1 [L] 

Po prostu utwórz folder taki sam jak nazwa domeny podrzędnej, której potrzebujesz. Folder musi istnieć w następujący sposób: domena.com/sub dla sub.domain.com .

Hafij Khan
źródło
To działa dla mnie, ale nie zachowuje pliku. Na przykład sub.domain.com/index.php rzut 404
Paolo Falomo