UrlRewrite - přesměrování a přepisování adres URL
Webový server IIS na Windows serverech umožňuje používat modul URLRewrite k dynamickému přepisování a přesměrovávání adres webových požadavků, které na něj chodí z internetu, pomocí tzv. přepisovacích pravidel. Tato pravidla se nastavují u daného webu přímo na serveru IIS, který si je potom ukládá v daném webu do souboru web.config do sekce configuration/system.webServer/rewrite/rules.
Tento soubor lze také upravovat přímo. Jelikož v případě webhostingu zákazník obvykle nemá přístup do konfigurace serveru IIS, aby si tam mohl pravidla nastavit, zbývá mu obvykle pouze si soubor web.config stáhnout přes FTP, náležitě upravit a poté opět přes FTP nahrát zpět upravený. Zde je příklad kompletního obsahu takového souboru web.config:
<?xmlversion="1.0" encoding="utf-8" ?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Moje pravidlo">
<match url="starastranka.html" />
<action type="Redirect" redirectType="Permanent" url="novastranka.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Uvnitř sekce „rules“ může být libovolný počet přepisovacích pravidel, všechna by měla vždy začínat elementem <rule> a končit ukončovacím</rule>. Pravidla se kontrolují jedno po druhém shora dolů.
Existují dva základní typy:
- Přesměrování znamená, že uživatel/návštěvník webu vidí, že byl přesměrován jinam, V adresním řádku se mu změní adresa na novou.
- Přepsání znamená, že se adresa přepíše pouze interně na serveru a uživatel to nepozná. V adresním řádku vidí stále původní adresu, kterou tam zadal.
Dokumentaci k celému modulu UrlRewrite naleznete v dokumentaci společnosti Microsoft.
Příklady nejčastějších případů použití.
Jednoduché přesměrování z jedné stránky na jinou
Přesměruje požadavek ze stránky „stara.aspx“ na stránku „nova.aspx“. Jedná se o přesměrování, takže se uživateli v prohlížeči změní adresa na novou. Přesměrování je nastaveno jako dočasné, což lze změnit přepsáním hodnoty u atributu redirectType.
<!--Jednoduchepresmerovani ze starestranky na novou -->
<rule name="Presmerovani 'stara.aspx' -> 'nova.aspx'">
<match url="^stara.aspx" />
<action type="Redirect" url="/rewrite/nova.aspx" redirectType="Temporary" />
<!-- Permanent - trvale presmerovani -->
<!-- Temporary - docasne presmerovani -->
</rule>
Přesměrování na doménu bez předpony "www."
Přesměruje jakýkoli požadavek typu www.domena.cz/cokolidalsiho na domena.cz/cokolidalsiho. V prohlížeči bude vidět nová adresa. Přesměrování je nastaveno jako trvalé.
<!--Presmerovani na domenu bez "www." -->
<rule name="Presmerovani 'www.domena.cz' -> 'domena.cz'" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="^www\.(.*)" />
</conditions>
<action type="Redirect" url="http://{C:1}/{R:1}" redirectType="Permanent" />
</rule>
Přesměrování z HTTP na HTTPS
Použijte, pokud máte na webu nainstalovaný důvěryhodný SSL certifikát a chcete, aby návštěvníci Vašich webových stránek používali výhradně šifrovanou komunikaci.
<!-- Presmerovani HTTP na HTTPS -->
<rule name="Presmerovani HTTP -> HTTPS" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
Přesměrování aliasu do podsložky
Přesměruje požadavek z vedlejší domény na hlavní doménu do stejnojmenné podsložky. Například www.alias.cz ->hlavnidomena.cz/alias.cz. Nezapomeňte v kódu přepsat texty „alias.cz“ a „hlavnidomena.cz“ požadovaným skutečným aliasem a hlavní doménou!
<!-- Presmerovani aliasu do podslozky -->
<rule name="Presmerovani 'alias.cz' a 'www.alias.cz' -> 'hlavnidomena.cz/alias/'">
<match url="(.*)" />
<conditions>
<add input="{HTTP_HOST}" pattern="domena.cz" />
</conditions>
<action type="Redirect" url="http://hlavnidomena.cz/alias.cz/{R:1}" redirectType="Temporary" />
</rule>
Přepisy adres na přehlednější
Pokud používáte nějaký redakční systém, adresy jsou tam často ve formátu: clanek?id=12345&title=TITULEK_CLANKU. To je pro uživatele ovšem nepřehledné, takže se často používá vnitřní (pro uživatele neviditelné) přepisování ze srozumitelnějšího 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'">
<match url="^clanek/([0-9]+)/([_0-9a-z-]+)" />
<action type="Rewrite" url="/clanek.aspx?id={R:1}&title={R:2}" />
</rule>
Ochrana proti útokům na SQL databázi
Útoky na SQL databáze přes webové stránky, které do databáze přistupují, jsou stále časté. Tímto nastavením to útočníkům poněkud ztížíte.
<!-- Ochrana proti utokum na SQL databazi -->
<rule name="Blokovani SQL utoku" stopProcessing="true">
<match url=".*" />
<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>
Blokování externího linkování obrázků
Máte na Vašich stránkách plno obrázků a nechcete, aby na ně mohl kdokoli z internetu odkazovat z vlastních stránek? S tímto nastavením budou Vaše obrázky viditelné pouze na Vašich stránkách. Když se někdo pokusí odkázat na nějaký Váš obrázek z jiných stránek z internetu, podstrčí se mu místo něj obrázek „linkovani_obrazku_blokovano.png“. Pravidlo testuje, jestli proměnná HTTP_REFERER (stránka, ze které vzešel tento požadavek) je buď prázdná, nebo je mezi Vámi povolenými doménami. Pokud ne, místo skutečného obrázku se podstrčí jiný s informací o zablokování.
<!-- Blokovani externiho linkovani obrazku -->
<rule name="Blokovani externiho linkovani obrazku" stopProcessing="true">
<match url=".*\.(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>