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

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.


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ę.


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]

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


2

Przekierowanie katalogu subdomeny:

RewriteCond %{HTTP_HOST} ^([^.]+)\.(archive\.example\.com)$ [NC]
RewriteRule ^ http://%2/%1%{REQUEST_URI} [L,R=301]

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 .


To działa dla mnie, ale nie zachowuje pliku. Na przykład sub.domain.com/index.php rzut 404
Paolo Falomo
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.