Mam dynamiczną strukturę subdomen, na przykład:

sub1.domain.com/file1
sub2.domain.com/file2
...
subn.somain.com/filen

Szukam rozwiązania jak wyświetlić pod adresem URL sub1.domain.com/file1 wynik wykonania skryptu znajdującego się w folderze głównym - domain.com/file.php?sub=sub1&file=file1, bez zmiany linku.

Próbowałem htaccess, ale przepisz przekierowania do domain.com/file.php?sub=sub1&file=file1, ale muszę pozostać na początkowym łączu.

Dziękuję za sugestie.

0
Steven Clay 19 grudzień 2019, 15:24
1
Musisz użyć Apache VirtualHost. Zobacz to tutaj : httpd.apache.org/docs/2.4/vhosts/examples. html. Powiedz mi, jeśli masz jakieś pytanie
 – 
Petoux
19 grudzień 2019, 15:26
Dziękuję, Petoux, też tak myślę, miałem nadzieję, że zrobię to przez .htaccess, ale zgadnij, że zadziałają tylko VirtualHosts. Dziękuję Ci.
 – 
Steven Clay
19 grudzień 2019, 15:35
Szukałem sposobu, aby uzyskać ten wynik za pomocą .htaccess, ale nic nie znalazłem! Cieszę się, że pomogłem
 – 
Petoux
19 grudzień 2019, 15:38
Wszystko czego potrzebujesz to domyślny host, a nie oddzielne wirtualne hosty. W tym hoście http możesz użyć modułu przepisywania, aby zareagować na rzeczywisty żądany host i wewnętrznie przepisać to żądanie, jak chcesz. Możesz to zrobić w dynamicznym pliku konfiguracyjnym (".htaccess"), ale z wielu powodów powinieneś zawsze preferować implementację takich reguł w rzeczywistej konfiguracji hosta http.
 – 
arkascha
19 grudzień 2019, 23:08

1 odpowiedź

Wszystko, czego potrzebujesz, to domyślny host, a nie oddzielne wirtualne hosty. Na tym hoście http możesz użyć modułu przepisywania, aby zareagować na żądany host i wewnętrznie przepisać to żądanie, jak chcesz:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?(.+)/?$ /file.php?sub=%1&file=$1 [END]

Aby to zadziałało, musisz upewnić się, że domyślny host http faktycznie obsługuje żądania do tych nazw hostów (nazywasz je „subdomenami”). Jest to jednak niezależne od faktycznego przepisywania.

W przypadku, gdy otrzymasz wewnętrzny błąd serwera (stan HTTP 500) za pomocą powyższej reguły, są szanse, że korzystasz z bardzo starej wersji serwera HTTP Apache. Zobaczysz określoną wskazówkę do nieobsługiwanej flagi {X0}} w pliku dziennika błędów serwerów HTTP w tym przypadku. Możesz spróbować uaktualnić lub użyć starego flagi [L], prawdopodobnie będzie działać tak samo w tej sytuacji, choć zależy nieco na konfiguracie.

Ta implementacja będzie działać podobnie w konfiguracji hosta HTTP serwerów lub wewnątrz dynamicznego pliku konfiguracyjnego (plik ".htaccess"). Oczywiście moduł przepisywania musi być załadowany wewnątrz serwera HTTP i włączony w hoście HTTP. W przypadku korzystania z dynamicznego pliku konfiguracyjnego musisz dbać, że interpretacja jest włączona w ogóle w konfiguracji hosta i jest umieszczona w folderze hosta DOCUMENT_ROOT.

I ogólna uwaga: Zawsze powinieneś umieścić takie reguły w konfiguracji hostacyjnej serwerów HTTP zamiast korzystać z dynamicznych plików konfiguracyjnych (".htaccess"). Te dynamiczne pliki konfiguracyjne dodają złożoność, są często przyczyną nieoczekiwanego zachowania, trudne do debugowania i naprawdę spowalniają serwer HTTP. Są one dostarczane tylko jako ostatnia opcja w sytuacjach, w których nie masz dostępu do konfiguracji hosta HTTP serwerów HTTP (czytaj: naprawdę tanich dostawców usług) lub do zastosowań nalegających na pisanie własnych zasad (co jest oczywistym koszmar bezpieczeństwa).

0
arkascha 19 grudzień 2019, 23:12