UrlRewrite - presmerovanie a prepisovanie adries URL
Webový server IIS na Windows serveroch umožnuje používať URLRewrite k dynamickému prepisovaniu a presmerovaniu adries webových požiadaviek, ktoré na neho chodia z internetu, pomocou tzv. prepisovacích pravidiel. Tieto pravidlá sa natavujú u daného webu priamo na servery IIS, ktorý si ich potom ukladá v danom webe do súboru web.config do sekcie configuration/system.webServer/rewrite/rules.
Tento súbor je možné tiež upravovať priamo. Keďže v prípade webhostingu zákazník obvykle nemá prístup do konfigurácie serveru IIS, aby si tam mohol pravidlá nastaviť, obvykle mu ostáva si iba súbor web.config stiahnuť cez FTP, náležito upraviť a potom opäť cez FTP nahrať späť upravený. Tu je príklad kompletného obsahu takého súboru web.config:
<?xmlversion="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Moje pravidlo">
<matchurl="starastranka.html" />
<action type="Redirect" redirectType="Permanent" url="novastranka.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Vnútri sekcie „rules“ môže byť ľubovolný počet prepisovacích pravidiel, všetky by mali vždy začínať elementom <rule> a končiť ukončovacím </rule>. Pravidlá sa kontrolujú jedno po druhom zhora dolu.
Existujú dva základné typy:
- Presmerovanie znamená, že užívateľ/návštevník webu vidí, že bol presmerovaný inam. V adresnom riadku sa mu zmení adresa na novú.
- Prepísanie znamená, že sa adresa prepíše iba interne na servery a užívateľ to nespozná. V adresnom riadku vidí stále pôvodnú addresu, ktorú tam zadal.
Dokumentáciu k celému modulu UrlRewrite nájdete v dokumentácii spoločnosti Microsoft.
Nasleduje niekoľko príkladov najčastejších prípadov použitia.
Jednoduché presmerovanie z jednej stránky na inú
Presmeruje požiadavku zo stránky „stara.aspx“ na stránku „nova.aspx“. Jedná sa o presmerovanie, takže sa užívateľovi v prehliadači o presmerovaní zmení adresa na novú. Presmerovanie je nastavené ako dočasné, čo je možné zmeniť prepísaním hodnoty atribútu redirectType.
<!--Jednoduchepresmerovanie ze starestranky na novou -->
<rule name="Presmerovani 'stara.aspx' -> 'nova.aspx'">
<matchurl="^stara.aspx" />
<action type="Redirect" url="/rewrite/nova.aspx" redirectType="Temporary" />
<!-- Permanent - trvale presmerovani -->
<!-- Temporary - docasne presmerovani -->
</rule>
Presmerovanie na doménu bez predpony "www."
Presmeruje akúkoľvek požiadavku typu www.domena.cz/cokolidalsiho na domena.cz/cokolidalsiho. V prehliadači bude vidno novú adresu. Presmerovanie je nastavené ako trvalé.
<!--Presmerovanie na doménu bez "www." -->
<rule name="Presmerovani 'www.domena.cz' -> 'domena.cz'" stopProcessing="true">
<matchurl="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)" />
</conditions>
<action type="Redirect" url="http://{C:1}/{R:1}" redirectType="Permanent" />
</rule>
Presmerovanie z HTTP na HTTPS
Použite, pokiaľ máte na webe nainštalovaný dôveryhodný SSL certifikát a chcete, aby návštevníci Vašich webových stránok používali výhradne šifrovanú komunikáciu.
<!-- Presmerovani HTTP na HTTPS -->
<rule name="Presmerovani HTTP -> HTTPS" stopProcessing="true">
<matchurl="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
Presmerovanie aliasu do podzložky
Presmeruje požiadavku z vedlajšej domény na hlavnú doménu rovnomennej podzložky. Napríklad www.alias.cz ->hlavnidomena.cz/alias.cz. Nezabudnite v kóde prepísať texty „alias.cz“ a „hlavnidomena.cz“ požadovaným skutočným aliasom a hlavnou doménou!
<!-- Presmerovani aliasu do podslozky -->br /><rule name="Presmerovani 'alias.cz' a 'www.alias.cz' -> 'hlavnidomena.cz/alias/'">
<matchurl="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="domena.cz" />
</conditions>
<action type="Redirect" url="http://hlavnidomena.cz/alias.cz/{R:1}" redirectType="Temporary" />
</rule>
Prepisy adries na prehladnejšie
Pokiaľ používate nejaký redakčný systém, adresy sú tam často vo formáte: clanek?id=12345&title=TITULEK_CLANKU. To je pre užívateľa neprehľadné, takže sa často používa vnútorné (pre užívateľov neviditeľné) prepisovanie zo zrozumiteľnejšieho formátu typu clanek/12345/TITULEK_CLANKU. V případě potřeby nezapomeňte upravit v textu tvar původní adresy a název cílové stránky.
<!-- Prepis pro redakcnisystem - srozumitelne adresy -->
<rule name="Prepis 'clanek/12/nadpis' na 'clanek.aspx?id=12&title=nadpis'">
<matchurl="^clanek/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="/clanek.aspx?id={R:1}&title={R:2}" />
</rule>
Ochrana proti útokom na SQL databázu
Útoky na SQL databázy cez webové stránky, ktoré do databázy pristupujú, sú stále časté. Týmto nastavením to útočníkom sťažíte.
<!-- Ochrana proti utokum na SQL databazi -->
<rule name="Blokovani SQL utoku" stopProcessing="true">
<matchurl=".*" />
<conditions>
<add input="{QUERY_STRING}" pattern="^.*(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).*" />
</conditions>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="You do not have permission to view this directory or page." />
</rule>
Blokovanie externého linkovania obrázkov
Máte na Vašich stránkach plno obrázkov a nechcete, aby na ne mohol ktokoľvek z internetu odkazovať z vlastných stránok? S týmto nastavením budú Vaše obrázky viditeľné len na Vašich stránkach. Keď sa niekto pokúsi odkázať na nejaký Váš obrázok z iných stránok z internetu, podstrčí sa mu miesto neho obrázok „linkovani_obrazku_blokovano.png“. Pravidlo testuje, či je premenná HTTP_REFERER (stránka, z ktorej vzišla táto požiadavka) je buď prázdná, alebo je medzi Vami povolenými doménami. Pokiaľ nie, miesto skutočného obrázku sa podstrčí iný s informáciou o zablokovaní.
<!-- Blokovani externiho linkovani obrazku -->
<rule name="Blokovani externiho linkovani obrazku" stopProcessing="true">
<matchurl=".*\.(gif|jpg|jpeg|png)$" />
<conditions>
<add input="{HTTP_REFERER}" pattern="^$" negate="true" />
<add input="{HTTP_REFERER}" pattern="domena.cz$" negate="true" />
<!— obdobnym zpusobem je zde potreba uvest vsechny domenove nazvy, ktere na vase obrazky odkazovat SMEJI a tudiz by se nemely blokovat -->
</conditions>
<action type="Rewrite" url="/rewrite/linkovani_obrazku_blokovano.png" />
</rule>