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!

none: Charles Robertson | none