...de igazából csak egy rendszergazda, de így jobban hangzott. :-)
Adott egy webhosting-szerver, Linux-szal. Tudjátok, ami összeborult egy hete. Na, hát akkor volt még egy függőben lévő dolog, hogy átirányítsam a mail.akármidomain.hu hivatkozást a www.akármidomain.hu/webmail címre.
Ez első blikkre egyszerűnek tűnik, de jön a bonyodalom: rengeteg a domain, és nem akarok annyi VirtualHost-ot felvenni az apache-ba, amennyit kéne. Csak egyet.
Minden domain esetében él egy Location beállítás, ami a /webmail könyvtárat egy fix helyről veszi, minden domain esetében. Ennek van azonban egy hátulütője: minden valamit is magára adó rendszergarázda használja az open_basedir rendszerváltozót (UGYE???), hogy az adott VirtualHost alatt futó PHP script-ek ne lássak kintebb a megengedett könyvtárnál. Viszont a /webmail- mivel mindegyik domain esetében ugyanoda mutat, így "open_basedir restricion in effect" hibaüzenetet kapna. Tehát a Location esetére módosítani kell az open_basedir-t egy olyan könyvtárra, amely túlmutat minden más hosting-könyvtáron. (ugyan nem férhet senki hozzá a webmail program webroot-jához, de "jobb a békesség"-alapon olyan helyre tesszük, ahol igazán semmi kárt nem okozhat).
Első körben létrehoztam egy VirtualHost-ot webmail címen, aminek a ServerName tulajdonsága
mail.hostingcég.hu
, majd egy darab ServerAlias-t:
mail.*
Na most igazából elég lenne ez is, ls írni egy PHP script-et, ami megvizsgálja, hogy a host mail.akármidomain.hu-e, és ha az első öt karakter "mail.", akkor átirányít a header függvénnyel (header("Location: http://www.akármidomain.hu/webmail");).
Meg lehetne oldani, hogy írok egy index.html-t, beteszem a webmail DocumentRoot-jába, és csak annyit csinál, hogy átirányít egy meta tag-gel pl. a webmail_redir.php-ra, ami pedig megvizsgálja, melyik domain.ről van szó, és megcsinálja ezt az átirányítást.
Csakhogy ez nekem nem tetszik. Ahogyan az alkalmazás-szintű header-ben történő átirányítás sem. Minek oldjak meg valamit alkalmazás- vagy megjelenítés-szinten, ha egyszer az architektúra alacsonyabb rétege (webszerver) is tudja ezt? Azon kívül eggyel több dolog lenne csak, amit adminisztrálni kell.
Na szóval, tartozik az Apache globális konfigurációs állományában (httpd.conf - Debian alatt apache2.conf) egy LocationMatch:
<LocationMatch ^/webmail/*>
php_admin_value "open_basedir" "/var/eleres_a webmail_konyvtárához"
</LocationMatch>
Ezzel kiküszöböltük, hogy az open_basedir az adott domain beállítását felülbírálja, és máshova mutasson.
De hol az átirányítás? Hát nem itt. (előre bocsátom, hogy tudtommal van szebb megoldás is az elkövetkezendőkre, de nem volt már cérnám utána nézni; ha majd lesz, publikálom)
Szóval az áritányításhoz bekapcsoltam a mod_rewrite modult. Sokkal viccesebb, mint a mod_alias által biztosított Redirect, mert tud egy rakás dolgot, ami nekünk most kell: ilyen pl. a feltételes átirányítás, a reguláris kifejezések használata und so weiter.
Jaj de jó, akkor most már vannak Rewrite függvényeink! (RewriteCond, RewriteRule stb).
Na először is kell a francnak a webmail DocumentRoot-ja, ha már egyszer úgyis átirányítást végzünk, úgyhogy állítsuk a DocumentRoot-ot egy biztonságos helyre: /dev/null :-))) Na jó, csak comment-ezzük ki, mert nem kell többé.
RewriteEngine on
Ezzel aktiváljuk a mod_rewrite modul által szolgáltatott dolgokat.
RewriteCond %{HTTPS} on
Megvizsgáljuk, hogy a kapcsolat SSL-en nyugszik-e avagy sem (ugyanis én perverz állat figyelni akarok arra, hogy http-ről vagy https-ről nyitják meg a kapcsolatot; de lehetne olyat is - ami egyszerűbb -, hogy kapásból csak https-re irányítjuk, és kész)
RewriteCond %{SERVER_NAME} ^mail.(.*)?$
Na, ez már kacifántosabb: megvizsgáljuk, hogy a ServerName vagy ServerAlias mail.akarmidomain.hu-e. És ha már vizsgálóduk, hát a zárójelben megadott .* meg is mondja, hogy mi áll a "mail." után. Tehát ismerjük a domain-t! Hurrá!
RewriteRule / https://www.%1/webmail
Átirányítjuk a böngészőt header segítségével a https://www.akarmidomain.hu/webmail oldalra. Az előbbi RewriteCond-ban lévő (.*) mondta meg, hogy melyik domain-ről van szó. Értelemszerűen ha több zárójeles kifejezést használunk, akkor több változót is kapunk a %1 mellé: %2, %3 stb. Attól függően, hogy mennyi kifejezést használtunk.
Na, viszont ez most csak HTTPS-re működik, és kell a HTTP változat is. Ez majdnem ugyanaz:
RewriteCond %{HTTPS} off
RewriteCond %{SERVER_NAME} ^mail.(.*)?$
RewriteRule / http://www.%1/webmail/
Csak itt arra játszunk, hogy a HTTPS off-ra ván állítva, és a RewriteRule-ban csak http-re irányítunk, nem https-re.
Lehetett volna használni SetEnv-et is, és akkor két sor mínusz, de nem jöttem rá, hogy pontosan hogyan lehet használni. Bocsi. Ahogy ígértem, majd közzé teszem.
Üdv néktek!