Peker domenet ditt til en underkatalog

Jeg har et wildcard DNS-oppsett på serveren min, noe sånt som .example.com. I rotmappen min er det noen nettsteder, så det jeg trenger er å ha noe slikt: test.example.com skal bruke test katalog (jeg har nesten 50 nettsteder, ikke bare en).

Jeg vil gjøre det med .htaccess fil. For øyeblikket har jeg følgende regler i min .htaccess fil:

 RewriteEngine On RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] RewriteCond %{DOCUMENT_ROOT}/%1 !-d RewriteRule ^ - [L,R=404] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$ [NC] RewriteCond %{DOCUMENT_ROOT}/%1 -d RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -d RewriteRule ^(.*)$ /%1/$1 [R=301,L] 

Det gjør noe, dvs. når jeg treffer test.example.com den treffer testkatalogen og henter data, men den skriver URL-en som test.example.com/test// (2 skråstrek på slutten).

Også når jeg klikker på en hvilken som helst lenke (f.eks. /login) det tar meg til test.example.com/login men det fungerer ikke mens test.example.com/test//login last side, men den sender ikke skjemadata som ble sendt inn for pålogging (mistet på grunn av 301-viderekobling).

I en katalog / .htaccess kontekst, vil koden du har lagt ut ovenfor ikke gjøre noe !? Så du ser enten resultatet av et hurtigbufret svar, noe som er ganske mulig siden du har å gjøre med 301 (permanente) viderekoblinger, som naturlig er hurtigbufret av nettleseren. Eller har du noen annen kode som utfører denne viderekoblingen?

Jeg kan heller ikke se hvor dobbel skråstrek ville komme fra, selv om "noe" skjedde - noe som ytterligere antyder for meg at du ser et bufret svar, eller noe annet går?

(Hvis disse direktivene imidlertid var direkte i serverkonfigurasjonen, i motsetning til .htaccess (som sagt), så vil disse direktivene sannsynligvis gjøre noe, og du vil virkelig få en dobbel skråstrek!)

Nærmere bestemt...

RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -d 

I en katalog / .htaccess sammenheng, vil disse forholdene aldri være vellykket, så følgende RewriteRule direktivet som utfører omdirigering, vil aldri forekomme. Du mente sannsynligvis å bruke REQUEST_URI servervariabel i stedet for REQUEST_FILENAME. (I server-sammenheng, REQUEST_FILENAME er det samme som REQUEST_URI på det tidspunktet forespørselen først ble behandlet.)

REQUEST_FILENAME inneholder allerede den absolutte filsystemstien som URI tilordnes til, så forut for dette med filsystemstien til DOCUMENT_ROOT og underkatalog kommer tydeligvis ikke til å fungere.

Imidlertid vil jeg stille spørsmål om du virkelig vil gjøre dette uansett. (dvs. sjekke for eksistensen av den forespurte filen / katalogen i den respektive underkatalogen før omdirigering.) Dette virker unødvendig etter min mening og begrenser typen "nettsteder" du kan være vert for. Jeg tror det ville være å foretrekke å omskrive alle forespørsler om underdomenet ubetinget til den respektive underkatalogen (hvis det eksisterer) og la hvert "nettsted" håndtere 404 - som lar deg ha en tilpasset 404 for hvert nettsted hvis du ønsker det.

Også, jeg tror dette burde være et intern omskriving (til underkatalogen), snarere enn en ekstern omdirigering. dvs. En forespørsel om test.example.com/login skal forbli på test.example.com/login (så langt som det brukeren ser) og ikke ekstern omdirigert til test.example.com/test/login? Ellers, hva er poenget med underdomenet? Dette vil også løse problemet med skjemadata som ikke sendes gjennom viderekoblingen (fordi en 301 gjør POST-forespørselen til en GET).

Så prøv noe som følger i stedet:

RewriteEngine On # Don't process requests for the www subdomain or apex domain RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC] RewriteRule ^ - [L] # Rewrite all direct requests for subdomains that exist as subdirectories RewriteCond %{ENV:REDIRECT_STATUS} ^$ RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com [NC] RewriteCond %{DOCUMENT_ROOT}/%1 -d RewriteRule (.*) /%1/$1 [L] 

Dine tidligere regler inkluderte en betingelse (gjentatt for hver regel) som ekskluderte forespørsler om www underdomenet. Jeg har skilt dette inn i sin egen regel.

Tidligere hadde du en forhåndskontroll som testet at underdomenet eksisterte som en underkatalog. Dette er unødvendig hvis du sjekker eksistensen av denne underkatalogen i den andre regelblokken.

De RewriteCond direktiv som sjekker mot REDIRECT_STATUS miljøvariabel sørger for at alle direkte forespørsler (fra klienten) blir omdirigert og ikke interne omskrivninger - som unngår en omskrivingsløkke. Merk at dette omskrives alle forespørsler (med mindre det er en annen .htaccess fil i underkatalogen som bruker mod_rewrite), uavhengig av om underkatalogen allerede er prefiks på URL-en - dette tillater nesting av underkataloger med samme navn, til enhver dybde, f.eks. /test/test/test/. Det vil imidlertid være å foretrekke at underkatalogen for nettstedet er unik på det området.

Fraværet av R flagg på RewriteRule gjør dette til en intern omskriving i stedet for en ekstern omdirigering (slik at nettadressen ikke oppdateres i adressefeltet).

Og sørg for at nettleserbufferen er klar!

fungert for deg: Charles Robertson | Ønsker du å kontakte oss?