Autor Zpráva
forkman
Profil *
Ahoj, řeším už pěknou dobu problém, že na serveru mám asi 15 domén a vždycky, když přibyde nová, musím ručně upravit htaccess, ale by i non-www verze nové domény přesměrovávala na variantu s www. Už mě to dost otravuje, poradili byste mi prosím, jak udělat takovéto pravidlo nezávislé na názvu domény a TLD?

RewriteCond  %{HTTP_HOST}  ^example\.cz
RewriteRule  example.cz/www/(.*)  http://www.example.cz/$1 [R=301,QSA,L]


Vygooglil jsem něco takového, ale to mi bohužel nefunguje a nevím jak se to dá ladit :-(

RewriteCond %{HTTP_HOST} ^([^.]*)\.([^.]*)$
RewriteRule %{HTTP_HOST}/www/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,QSA,L]
Kajman_
Profil *
Ono asi není možné dávat 4 a % proměnné do prvního parametru rewriterule, jen do druhého. Možná by šlo udělat tu podmínku na cestu přes další rewritecond (ale nejsem si jistý, jestli tam bude %{HTTP_HOST}/www/ nebo jen ta závorka).

RewriteCond %{HTTP_HOST} ^([^.]*)\.([^.]*)$
RewriteCond %{REQUEST_URI} %{HTTP_HOST}/www/(.*)
RewriteRule .* http://www.%{HTTP_HOST}/%1 [R=301,QSA,L]


K ladění lze zapnout rewritelog, ale pro ostrý provoz se moc nedoporučuje jeho zapnutí (s vysokým levelem informování).
__construct
Profil
Podľa mojich znalostí regexpov by malo toto fungovať:
RewriteCond %{HTTP_HOST} ^(?!www\.)([a-zA-Z0-9-]+)\.([a-z]{2,4})
RewriteRule %{HTTP_HOST}/www/(.*) http://www.%{HTTP_HOST}/$1 [R=301,QSA,L]
Davex
Profil
forkman:
Jednoduché doplnění www před všechny domény druhého řádu by mohlo fungovat takto:
RewriteCond  %{ENV:REDIRECT_STATUS}  =""
RewriteCond  %{REQUEST_METHOD}  !=POST
RewriteCond  %{HTTP_HOST}  ^([^.]+\.[^.]+)$
RewriteRule  ^(.*)$  http://www.%1/$1  [R=301,NE,L]

Občas se může hodit i doplnění www před libovolnou subdoménu:
RewriteCond  %{ENV:REDIRECT_STATUS}  =""
RewriteCond  %{REQUEST_METHOD}  !=POST
RewriteCond  %{HTTP_HOST}  !^www\.
RewriteRule  ^(.*)$  http://www.%{HTTP_HOST}/$1  [R=301,NE,L]
forkman
Profil *
2 Kajman_ & __construct: Bohužel vaše řešení nic nematchne, ale mám tak trochu speciální případ a proto je s tím tolik problémů:)

2 davex: Tvoje řešení tak na půl funguje, ale nezohledňuje to první část mého původního RewriteRule. Abych popsal můj speciální případ:

Jelikož moje lenost je nekonečná, mám Apače nastaveného na dynamické vhosty, tzn, že ve /var/www vytvořím adresář s názvem domény, v něm vytvořím adresář www a už to funguje (pak to vypadá např takhle /var/www/example.cz/www) a to je právě ten kámen úrazu. Htaccess na přesměrování na www mám přímo ve /var/www a ten musí zohlednit, že z adresáře /var/www mě to musí přesměrovat do example.cz/www, ale tuhle část už to nemůže nacpat do uri stránky, prostě to přesměrovává takhle:
http://www.example.cz/example.cz/www/
Pokoušel jsem se to RewriteRule upravovat, ale nějak tomu nerozumím :-) Potřeboval bych něco jako tohle, ale to bohužel nefunguje:
RewriteRule  ^%1/www/(.*)$  http://www.%1/$1  [R=301,QSA,L]
__construct
Profil
Dovolím si citovať výrok Briana Moorea:
''Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''

RewriteEngine on

RewriteCond %{HTTP_HOST} ^(?!www\.)([a-zA-Z0-9-]+)\.([a-z]{2,4})
RewriteRule   ^(.+)                        http://www.%1/$1          [C]
RewriteRule /var/www/%{HTTP_HOST}/www/(.*) http://www.%{HTTP_HOST}/$1 [R=301,QSA,L]
forkman
Profil *
Tak vyjadřuju svůj absolutní souhlas, že mod_rewrite je voodoo, protože tvůj poslední nápad dělá to, že example.cz přesměruje na http://www.example.com/example.cz/www/ a absolutně vůbec netuším, jak si to může vymyslet jinou TLD. Mám tam domény s TLD cz a net a u obou se to přesměruje vždycky na com. Fakt voodoo. Kdybych tomu aspoň rozumněl ... :-)
Davex
Profil
forkman:
mám Apače nastaveného na dynamické vhosty
To je docela podstatná informace. Tím se nastavení samozřejmě komplikuje a záleží na tom, jak máš nakonfigurovaný mod_vhost_alias. Mod_rewrite za to nemůže, protože zpracovává jinou cestu než v obvyklé konfiguraci s VirtualHosty.

Nevím přesně, jak máš nastavené dynamické vhosty, ale mělo by stačit přidat na začátek regulárního výrazu rozlišení podadresáře od umístění souboru .htaccess:
RewriteCond  %{ENV:REDIRECT_STATUS}  =""
RewriteCond  %{HTTP_HOST}  ^([^.]+\.[^.]+)$
RewriteRule  ^[^.]+\.[^.]+/(?:www/)?(.*)$  http://www.%1/$1  [R=301,QSA,L]
forkman
Profil *
Dík moc, tohle už zabralo, odvážil jsem se to vyzkoušet až teď, protože to je na ostrém serveru. Ještě jednou díky!

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0