Minu serveris on metamärgi DNS-i seadistus, umbes nagu .example.com
. Minu juurkaustas on mõned saidid, nii et mul on vaja midagi sellist: test.example.com
peaks kasutama test
kataloog (mul on ligi 50 saiti, mitte ainult üks).
Ma tahan seda teha .htaccess
faili. Praegu on minu seaduses järgmised reeglid .htaccess
fail:
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]
See teeb midagi, st kui ma taban test.example.com
see tabab testkataloogi ja toob andmed, kuid URL-i kirjutab test.example.com/test//
(Lõpus 2 kaldkriipsu).
Samuti, kui klõpsan mõnel lingil (nt. /login
) see viib mind test.example.com/login
kuid see ei tööta samal ajal test.example.com/test//login
laadige leht, kuid see ei saada vormi andmeid, mis esitati sisselogimiseks (kadunud 301 ümbersuunamise tõttu).
Kataloogis / .htaccess
kontekstis ei tee ülaltoodud kood tegelikult midagi !? Niisiis, kas näete vahemällu salvestatud vastuse tulemust, mis on täiesti võimalik, kuna tegemist on 301 (püsiva) ümbersuunamisega, mille brauser loomulikult vahemällu salvestab. Või on teil mõni muu kood, mis seda ümbersuunamist teostab?
Samuti ei näe ma, kust peaks topeltkriips tulema, isegi kui "midagi" juhtus - mis vihjab mulle veel, et näete vahemällu salvestatud vastust või midagi muud läheb?
(Kui need direktiivid olid aga otse serveri konfiguratsioonis, mitte .htaccess
(nagu öeldud), siis need direktiivid ilmselt teeksid midagi ja sa saaksid tõesti topeltkriipsu!)
Täpsemalt ...
RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -f [OR] RewriteCond %{DOCUMENT_ROOT}/%1%{REQUEST_FILENAME} -d
Kataloogis / .htaccess
kontekstis need tingimused on mitte kunagi olla edukas, nii et järgmine RewriteRule
suunamist teostavat direktiivi ei toimu kunagi. Tõenäoliselt tahtsite seda kasutada REQUEST_URI
serveri muutuja asemel REQUEST_FILENAME
. (Kuid serveri kontekstis REQUEST_FILENAME
on sama nagu REQUEST_URI
taotluse esialgse töötlemise ajal.)
REQUEST_FILENAME
sisaldab juba absoluutset failisüsteemi teed, millega URI kaardistab, seega lisage see faili failisüsteemi teele DOCUMENT_ROOT
ja alamkataloog ilmselt ei hakka tööle.
Kuid ma küsiksin, kas soovite ikkagi seda teha. (st. enne ümbersuunamist kontrollige taotletud faili / kataloogi olemasolu vastavas alamkataloogis.) See tundub minu arvates ebavajalik ja piirab hostitavate "saitide" tüüpi. Ma arvan, et eelistatav oleks kõik alamdomeeni taotlused tingimusteta ümber kirjutada vastavasse alamkataloogi (kui see on olemas) ja lubada igal "saidil" 404-ga hakkama saada - mis võimaldab teil soovi korral iga saidi jaoks kohandatud 404-d.
Samuti arvan, et see peaks olema sisemine ümberkirjutamine (alamkataloogi), mitte välise ümbersuunamise kaudu. st. Taotlus test.example.com/login
peaks jääma test.example.com/login
(nii palju kui kasutaja näeb) ja mitte väliselt ümber suunatud kuni test.example.com/test/login
? Muidu, mis mõte on alamdomeenil? See lahendaks ka vormi andmete ümbersuunamise kaudu edastamata jätmise küsimuse (kuna 301 muudab POST-päringu GET-ks).
Proovige selle asemel midagi järgmist:
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]
Teie eelmised reeglid sisaldasid tingimust (mida korrati iga reegli puhul), mis välistas selle taotlused www
alamdomeen. Olen selle lahutanud oma reegliks.
Varem oli teil eelkontroll, mis kontrollis alamdomeeni olemasolu alamkataloogina. See pole vajalik, kui kontrollite selle alamkataloogi olemasolu teises reeglite plokis.
The RewriteCond
direktiiv, mis kontrollib REDIRECT_STATUS
keskkonnamuutuja tagab, et kõik otsesed päringud (kliendi käest) suunatakse ümber ja mitte sisemisi ümberkirjutusi - mis väldib tsükli ümberkirjutamist. Pange tähele, et see kirjutab ümber kõik taotlusi (kui pole veel ühtegi .htaccess
fail alamkataloogis, mis kasutab mod_rewrite), olenemata sellest, kas alamkataloog on juba URL-is eesliidetud - see võimaldab samanimeliste alamkataloogide pesitsemist, näiteks sügavusele. /test/test/test/
. Siiski oleks eelistatav, et saidi alamkataloog oleks sellel saidil ainulaadne.
Puudumine R
lipp lipul RewriteRule
teeb sellest an sisemine ümberkirjutamine asemel väline ümbersuunamine (nii et URL-i ei värskendata aadressiribal).
Ja veenduge, et brauseri vahemälu oleks puhas!