Autor Zpráva
miamia
Profil
prosím Vás mám tento htaccess
Options +FollowSymLinks -Multiviews
RewriteEngine on
RewriteBase /


RewriteCond %{HTTP_HOST} ^www\.domena\.sk [NC,OR]
RewriteCond %{HTTP_HOST} ^domena\.sk [NC]

RewriteCond %{DOCUMENT_ROOT}/x/a/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/x/a/$1 -d
RewriteRule (.*) /x/a/$1 [L]



   RewriteCond %{HTTP_HOST} !^www\.domena\.sk [NC]
   RewriteCond %{HTTP_HOST} ^([^.]+)\.domena\.sk$ 

   RewriteCond %{DOCUMENT_ROOT}/x/b/%1/$1 -f [OR]
   RewriteCond %{DOCUMENT_ROOT}/x/b/%1/$1 -d
   RewriteRule (.*) /x/b/%1/$1 [L]


Ako v ňom nahradím všetky výskyty "domena\.sk" (spolu 4) tak, aby sa táto hodnota automaticky doplnila podľa toho, aká doména je zadaná do prehľadavača??? teda aby som to nemusel vždy prepisovať podľa toho, v akom priečinku sa htaccess nachadza.diky moc
Davex
Profil
Doména jde získat z podmínky a dosadit do cesty asi nějak takto (netestováno):
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+\.[^.]+)$ [NC]
RewriteCond %{DOCUMENT_ROOT}/x/%1/www/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/x/%1/www/$1 -d
RewriteRule (.*) /x/%1/www/$1 [L]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)\.([^.]+\.[^.]+)$ 
RewriteCond %{DOCUMENT_ROOT}/x/%2/%1/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/x/%2/%1/$1 -d
RewriteRule (.*) /x/%2/%1/$1 [L]

Cesta pro subdoménu musí vypadat nějak takto: /x/domena.sk/subdomena/adresar/soubor.
miamia
Profil
diky za radu, nahradil som to tmto sposobom:

RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+\.[^.]+)$ [NC,OR]
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)$


RewriteCond %{HTTP_HOST} !^(?:www\.)?([^.]+\.[^.]+)$ [NC]
RewriteCond %{HTTP_HOST} ^([^.]+)(\.[^.]+\.[^.]+)$
Davex
Profil
miamia:
nahradil som to tmto sposobom
Proč? Něco nefungovalo?

V prvním případě je zbytečné zdvojovat regulární výraz, protože ten druhý je již obsažen v prvním. Druhý případ je také zbytečně zkomplikovaný - v první podmínce stačí vyloučit jen www na začátku, protože druhému výrazu vyhoví pouze doménové jméno obsahující dvě tečky.
miamia
Profil
pravdupovcediac nie som expert na tie výrazy, preto som tam dal tie podmienky asi komplikovanejšie. Na vysvetlenie. strukturu mam takuto folder/root/web a folder/root/sub. Doména je nasmerovaná do /folder/, kde je htaccess s týmto kódom a on smeruje požiadavky ďalej do adresárov- momentálne mi väčšina funguje, ale mám zásadný problém v tomto htaccess:
 # ak je www 
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+\.[^.]+)$ [NC,OR]
 # ak je domena bez www zadana, ale bez subdomeny
RewriteCond %{HTTP_HOST} ^([^.]+\.[^.]+)$
RewriteRule (.*) /root/web/$1 [QSA,L]

 # ak subdomena neni www
   RewriteCond %{HTTP_HOST} !^(?:www\.)?([^.]+\.[^.]+)$ [NC]
 # vyextrahuj subdomenu do %1 
   RewriteCond %{HTTP_HOST} ^([^.]+)(\.[^.]+\.[^.]+)$ 
   RewriteRule (.*) /root/sub/%1/$1 [QSA,L]


PROBLÉM: Mojim problémom je, že pokiaľ v /root/web/ nemám htaccess, tak dostávam internal server error. ak ale tam vložím htaccess s riadkom RewriteEngine on, všetko ide ok. v čom robím prosím chybu?

tiež som odstránil z pôvodného riadky (išli by v tomto prípade pred riadok č.5)
RewriteCond %{DOCUMENT_ROOT}/root/web/$1 -f [OR]
RewriteCond %{DOCUMENT_ROOT}/root/web/$1 -d

lebo keď tam boli, tak mi nefungovali podmienky v /root/web/ htaccess (napr. zadal som domena.sk/ss a ono hladalo folder "ss/" namiesto toho, aby zohľadnilo podmienku v htaccess root/web, kde som mal napísané, že "ss" má smerovať na súbor old.html)


P.S. skúsim to otestovať neskôr aj s pôvodnými tvojimi úpravami, no teraz zatiaľ väčšina vecí ide, tak by som najradšej rozchodil ešte ten problém, čo som popísal vyššie a následne potom to preskúšam s tými pôvodnými jednoduchšími podmienkami. v každom prípade vopred diky za pomoc.
Davex
Profil
Kompletní kód by měl vypadat asi takto. Zjednodušil jsem regulární výrazy a přidal tam ochranu proti zacyklení, které způsobuje tu chybu 500 Internal Server Error.
RewriteEngine On

# nezacyklit
RewriteRule ^root/ - [S=99]

# ak je www nebo domena bez subdomeny
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+\.[^.]+)$ [NC]
RewriteRule (.*) /root/web/$1 [QSA,L]

# ak subdomena neni www
RewriteCond %{HTTP_HOST} !^www\. [NC]
# vyextrahuj subdomenu do %1 
RewriteCond %{HTTP_HOST} ^([^.]+)\.[^.]+\.[^.]+$ 
RewriteRule (.*) /root/sub/%1/$1 [QSA,L]
miamia
Profil
no supeeeer! paráda, ďakujem pekne. už to väčšinou robí presne to, čo by malo.

mám už len zopár vecí, ktoré sa pokúšam ošetriť:
-problémom zostáva, že keď som v joomle v adresáry /web zapol generovanie sef urls, tak odkazy nie sú domena.sk/fotogaleria ale domena.sk/root/web/fotogaleria, co je značný problém. nechápem, prečo sa tam pridáva tá časť "root/web/"

-ak otvorím www.domena.sk/root/ tak sa zobrazí FORBIDDEN, teoreticky ok, ale lepšie by bolo, aby presmerovalo adresu do základného www.domena.sk (bez /root/ na konci)

-ak otvorím neexistsub.domena.sk tak Not Found, tu by bolo fajn rovnaké riešenie, ako v predošlom kroku - presmerovať adresu do základného www.domena.sk.

ak www.domena.sk/aaa a folder aaa existuje, tak prepíše adresu na www.domena.sk/root/web/aaa/ bolo by vhodné, aby neprepísalo na root/web/aaa/, ale aby to nechalo len tak a zobrazilo povedzme hlásenie, že nenájdené (rovnako by sa to malo chovať aj pod subdoménami).

myslím, že ak by sa týchto pár vecí dalo ošetriť, už by to mohlo byť z veľkej časti fajn. diky za tvoj čas.
Davex
Profil
miamia:
ad 1) „nechápem, prečo sa tam pridáva tá časť "root/web/"
Joomla v tom adresáři je, a proto do něj vytváří odkazy. Musí se jí dát nějak najevo, že má odkazy vytvářet zkrácené, ale s konfigurací serveru to nesouvisí.

ad 2) a 3) „ak otvorím www.domena.sk/root/ tak sa zobrazí FORBIDDEN
ak otvorím neexistsub.domena.sk tak Not Found
Ty chyby jsou naprosto v pořádku. Pokud není k něčemu přístup nebo to nikdy neexistovalo, tak se má zobrazit chyba a ne přesměrovat.

ad 4) „ak www.domena.sk/aaa a folder aaa existuje, tak prepíše adresu na www.domena.sk/root/web/aaa/
Řešení tohoto problému jsem naznačil v sousedním vlákně mod_rewrite - subdomény - hosting wedos. Stačí přidat pravidlo před ostatní a upravit cestu v regulárním výrazu.
miamia
Profil
pridal som
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^root/web/([a-z0-9-]+)/(.*)$ /$2 [R,L]

za RewriteRule ^root/ - [S=99] ale stále nič. :(
Davex
Profil
miamia:
za RewriteRule ^root/ - [S=99] ale stále nič. :(
Patří před toto pravidlo, protože ono zastavuje provádění dalších pravidel pro cestu začínající na /root/ . Také bude vhodná úprava regulárního výrazu pro variantu s www i subdoménou:
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^root/(web|sub/[a-z0-9-]+)/(.*)$ /$2 [R,L]
miamia
Profil
hm, skúšal som pred i za a stále žiaden efekt.

takto vyzerá môj terajší htaccess
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^root/(web|sub/[a-z0-9-]+)/(.*)$ /$2 [R,L]

# nezacyklit
RewriteRule ^root/ - [S=99]

# ak je www nebo domena bez subdomeny
RewriteCond %{HTTP_HOST} ^(?:www\.)?([^.]+\.[^.]+)$ [NC]
RewriteRule (.*) /root/web/$1 [QSA,L]

# ak subdomena neni www
RewriteCond %{HTTP_HOST} !^www\. [NC]
# vyextrahuj subdomenu do %1 
RewriteCond %{HTTP_HOST} ^([^.]+)\.[^.]+\.[^.]+$ 
RewriteRule (.*) /root/sub/%1/$1 [QSA,L]
Davex
Profil
Pokud je v adresáři /root/web/ také soubor .htaccess s mod_rewrite pravidly, tak se vykonají pouze tato pravidla a ostatní se budou ignorovat. Bude nutné přidat přesměrování ještě do všech souborů .htaccess u subdomén, která mají vlastní pravidla.

RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteCond %{REQUEST_URI} ^/root/
RewriteRule ^(.*)$ /$1 [R,L]

Vidíš sám, že tento způsob vytváření subdomén pomocí mod_rewrite pravidel v souboru .htaccess je nevhodný a přináší spoustu problémů. Nedoporučuji ho používat.
miamia
Profil
no teda, máš pravdu, prináša to samé úskalia. zaujímavé je, že im to na tom hostingu wedos funguje. hm, keby sa tak podelili s tým, ako to robia.
ale v každom prípade Ti veľmi pekne ďakujem za poradenie.
Davex
Profil
miamia:
zaujímavé je, že im to na tom hostingu wedos funguje
Domnívám se, že subdomény tam víc nefungují než fungují a že časem budou muset zavést podporu subdomén stejně jako na každém normálním hostingu. Ale nebudu to víc rozebírat - je to mimo téma.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: