Proxování obsahu z cizích serverů

pomocí mod_rewrite

Občas pocítím potřebu dát na svůj web nějaký prvek z cizího serveru. Kvůli technickým omezením je ale potřeba, aby to vypadalo, že je tento prvek načítán ze serveru mého. Takovým technologickým omezením mohou být některé javascripty, které berou obsah jenom ze stejné domény. Jiným příkladem technického omezení je objekt, který je poskytován pouze na http protokolu, ale já ho chci vložit do své https stránky. Protože si ji nechci kompromitovat, musím to udělat tak, aby to vypadalo, že obrázek je z nějakého https serveru (třeba mého).

Technicky to potom funguje tak, že uživatel požádá o prvek z mého serveru. Můj server se podívá do svých pravidel v .htaccess (popíšu níže) a zjistí, že má obsah načíst z jiného serveru. To udělá. Načte obsah z jiného serveru a poskytne ho uživateli na stejné adrese. Funguje tedy jako proxy, a tak se takovému poskytování cizího obsahu někdy říká proxování.

Předpoklady

Mám možnost na serveru pracovat se souborem .htaccess.

Na serveru běží mod_rewrite - dnes již relativně běžné.

Na serveru běží mod_proxy - to je docela silný předpoklad. Na mnoha sdílených hostinzích mod_proxy neběží, ale na některých ano.

Často je potřeba, aby proxovaný obsah běžel na protokolu http, nikoli na https.

Jednoduchý příklad

Budu chtít, aby obrázek ze serveru example.com uměl poskytnout z mého serveru.  Když uživatel zadá adresu muj-server.cz/obrazek.gif , zobrazí se v prohlížeči obsah z adresy example.com/obrazek.gif, ale adresa zůstane stejná. Do .htaccess na muj-server.cz zadám tyto řádky:

# proxovani
RewriteEngine on
RewriteRule   obrazek\.gif   http://example.com/obrazek.gif   [P]

Příklad používá zápis mod_rewrite. Ten můžete znát z jiných použití mod_rewrite (většinou podstrkávání nebo přesměrování). Toto proxování se podobá podstrkávání. Zadaná adresa (obrazek.gif) zůstává v prohlížeči. Obsah se načte z druhého parametru pravidla RewriteRule, v tomto případě ze vzdáleného serveru example.com.

(Zpětné lomítko v řetězci  obrazek\.gif  je jenom escapování tečky. Některé znaky se musí takto escapovat, aby se nevykládaly jako regulární výraz.)

Přepínač [P] na konci pravidla říká, že se bude proxovat. Bez něj by to nefungovalo, protože se obsah načítá z cizího serveru. Pokud chcete načítat obsah ze stejného serveru, použijte mod_rewrite normálně bez [přepínačů].

Pokud budete tento příklad chtít vyzkoušet nezapomeňte prosím přepsat adresy na nějaké reálné. Na adrese example.com žádný obrazek.gif není.

Jestliže vám nebude fungovat ani takovýto jednoduchý příklad, napřed zkontrolujte, zda máte zapnutý a funkční mod_rewrite (třeba nějakým příkladem z návodu na mod_rewrite).

Nejčastějším důvodem nefunkčnosti tohoto příkladu je absence nebo vypnutí modulu mod_proxy na serveru. Když se v RewriteRule objeví flag [P], mod_rewrite takovou instrukci potom ve skutečnosti předává modulu mod_proxy. Jestli na vašem serveru mod_proxy běží, se dozvíte buďto od admina serveru, nebo to prostě vyzkoušíte.

Příklad s proxováním celého adresáře

Předchozí příklad není moc užitečný, protože v praxi většinou chci, abych mohl volat z cílového serveru více prvků než jeden konkrétní soubor. Většinou se to dělá tak, že si na svém serveru určím cestu, ze které se budou požadavky proxovat na cizí server.

# proxovani celeho adresare
RewriteEngine on
RewriteRule   obrazky/(.*)$   http://example.com/pictures/$1   [P]

Příklad požadavku:

obrazky/026.gif

vrátí obsah z

http://example.com/pictures/026.gif

Vysvětlení RewriteRule: kdykoli požadavek začíná řetězcem obrazky/, vezme se všechno, co je za tím (to je ten regulární výraz (.*)$), a uloží se to do proměnné $1. Server pak vezme začátek cizí adresy a proměnnou $1 k ní přilepí, čímž vznikne adresa na cizí web, na kterou si sáhne pro obrázek. Tento obrázek pak vrátí na původní požadované adrese (tedy obrazky/něco).

Příklad z praxe

Server Wunderground poskytuje veřejně obrázky s aktuální předpovědí počasí pro různé lokality. Rád je dávám do svých cestovatelských webů, protože je to jednoduché. V roce 2016 jsem ale svoje weby převedl na protokol https. Do stránky, která běží na https, se ale nesmějí dávat prvky načítané z http protokolu, protože by to kompromitovalo zabezpečené spojení. Ideální by bylo, kdyby i Wunderground uměl poskytovat obrázky na zabezpečeném protokolu https, ale nedělá to. Musel bych proto tyto obrázky načítané z cizího serveru ze svých stránek odstranit. Raději používám proxování.

Do .htaccess na svém webu jsem dal tento zápis:

# Gify s počasím
# wunderground/07761.gif přepsat na
# http://banners.wunderground.com/weathersticker/bigwx_metric_cond/language/www/global/stations/07761.gif
# konec poznámky
RewriteRule wunderground/(.*)$ http://banners.wunderground.com/weathersticker/bigwx_metric_cond/language/www/global/stations/$1 [P]

Kdykoli tedy na svém webu, kde mi to běží, použiju adresu začínající na wunderground, server si sáhne na server wunderground.com a obrázek na požadované adrese poskytne jako svůj.

Jiné možnosti proxování

V praxi je jistější při potřebě proxování umístit na server nějaký skript (typicky PHP), který si stáhne vzdálený zdroj a potom ho sám pošle na výstup. Je to funkčnější, protože není potřeba spoléhat se na mod_proxy, ale pouze na funkce skriptovacího jazyka, které jsou běžně dostupné (v PHP typicky funkce file_get_contents()). Já třeba v PHP používám tento jednoduchý zápis (v $remote_url mám URL toho, co chci proxovat):

// načte obsah ze vzdáleného serveru
if(@$obsah = file_get_contents($remote_url)) {
    // vyplivne obsah na výstup
    echo $obsah;
}
else {
    http_response_code(404);
    echo "nenalezeno 404";
}

Proč to moc nepoužívat

Proto doporučuji používat proxování s rozmyslem. Dokud to používám na stránkách, přes které se takhle stáhnou malé stovky obrázků za den, tak mi to přijde v pohodě. V předchozím případě mám navíc zřejmý důvod to dělat - potřebují obsah určený k šíření poskytovat na zabezpečeném https spojení, a tak ho proxuji přes svůj server přes https.

V naprosté většině případů se ale dá normálně použít prvek z cizího serveru a není potřeba nic proxovat. Pokud nemusíte, proxování přes mod_rewrite nepoužívejte.

Publikováno 29. 12. 2016

 

Reklama

www.webhosting-c4.cz, extra rychlý SSD webhosting s doménou v ceně
o tvorbě, údržbě a zlepšování internetových stránek

Návody HTML CSS JavaScript Články Ostatní

Encyklopedie FrontPage Reklama PHP Server

Jak psát web píše Yuhů, Dušan Janovský. Kontakt.