Apache httpd
Redirect / Rewrite

Lukáš Bařinka

© 2021

REV 2.10

TOC

Obsah

  1. Redirect Vs Rewrite
  2. Alias and Redirect
  3. Rewrite
  1. Přesměrování Vs Přepisování
  2. Směrování (Alias a Redirect)
  3. Přepisování (Rewrite)

Redirect Vs Rewrite

Přesměrování Vs Přepisování

Alias and Rewrite modules

Moduly alias a rewrite

Redirect vs Rewrite scheme
  • Simple redirection (static)mod_alias
  • Conditional redirection (dynamic)mod_rewrite
  • Jednoduché přesměrování (statické)mod_alias
  • Podmíněné přesměrování (dynamické)mod_rewrite

Redirecting Vs Rewriting

Přesměrování Vs Přepisování

  • Redirection takes place in WS (web space) Response contains new URL information, reaction is up to client
  • Rewriting takes place in WS or FS (file system) Response contains new URL (like in redirection) or requested resource (after rewriting)
  • Redirection status codes (class 3xx):
    • 301 Moved Permanently Use new URL since
    • 302 Found Temporary move
      (use original URL next time)
    • 303 See Other Replaced with new resource
    • 305 Use Proxy Resource available through proxy
  • Přesměrování probíhá ve WS Odpovědí je informace o změně URL, reakce je závislá na klientovi
  • Přepisování probíhá ve WS nebo FS Odpovědí je informace o změně URL (reakce je na klientovi) nebo soubor (na základě přepsání)
  • Přesměrování používá stavové kódy 3xx
    • 301 Moved Permanently Trvale přesunuto, odteď použij novou URL
    • 302 Found Dočasně přesunuto, příště zase zkus původní URL
    • 303 See Other Nahrazeno novým zdrojem
    • 305 Use Proxy Použít proxy pro přístup k tomuto zdroji

Alias and Redirect

Směrování
(Alias a Redirect)

Directives

Direktivy

  • Redirect directive Redirects client from origin URL to new URL
  • RedirectMatch directive Redirection based on Regular Expression
  • RedirectTemp directive = Redirect temp
  • RedirectPermanent directive = Redirect permanent
  • Redirect Přesměrovává klienta ze starého URL na nové
  • RedirectMatch Přesměrovává klienta na základě RE
  • RedirectTemp = Redirect temp
  • RedirectPermanent = Redirect permanent

Redirect directives takes precedence before Alias and ScriptAlias directives.

Direktivy Redirect mají přednost před Alias, ScriptAlias.

Syntax

Syntaxe


							Redirect [status] URLpath newURL
						
  • Default status code: 302
  • Other status keywords/codes
    • permanent = 301
    • temp = 302
    • seeother = 303
    • gone = 410 Resource does not exist any more, no newURL parameter
  • Only complete path segments are matched
  • Výchozí stavový kód (status): 302
  • Další názvy stavů / kódy
    • permanent = 301
    • temp = 302
    • seeother = 303
    • gone = 410 Zdroj již neexistuje, nepoužívá se část newURL
  • Porovnávají se pouze celé části cesty
Context: server, virtualhost, directory, .htaccess Kontext: server, virtualhost, directory, .htaccess

Redirection examples

Příklady použití přesměrování

  • Redirect requests for resources starting with www.mycorp.net/other to another server www.othercorp1.net
    
    									Redirect permanent /other www.othercorp1.net
    								
  • Redirect request for resources ending with .htm extension to .html extension For www.mycorp.net server
    
    									RedirectMatch (.*)\.htm$ www.mycorp.net$1.html
    								
  • Homepage move - redirection requests for / (root) to /about/ directory
    
    									RedirectMatch ^/$ http://www.mycorp.net/about/
    								
  • Přesměrování cesty www.mycorp.net/other na server www.othercorp1.net
    
    									Redirect permanent /other www.othercorp1.net/
    								
  • Přesměrování všech požadavků končících .htm na požadavky končící na .html Pro server www.mycorp.net
    
    									RedirectMatch (.*)\.htm$ www.mycorp.net$1.html
    								
  • Přesun domovské stránky - přesměrování požadavku na / (kořen) na adresář /about/
    
    									RedirectMatch ^/$ http://www.mycorp.net/about/
    								

Rewriting

Přepisování (Rewrite)

mod_rewrite module

Modul mod_rewrite

  • Module available in standard installation
  • Enables redirection/rewrite based on conditions and rules sets
    • Any number of rules (RE, LE)
    • Any number of conditions (and, or)
    • Chains of rules are possible
  • Redirection
    • Internal: URL → FS
    • External: URL → URL
  • Rewriting rules do not inherit Inheritance can be enabled explicitly
  • Součástí standardní instalace
  • Umožňuje přesměrování na základě pravidel a podmínek
    • Libovolný počet pravidel (RE, LE)
    • Libovolný počet podmínek (and, or)
    • Možné řetězení pravidel
  • Přesměrování
    • Vnitřní: URL → FS
    • Vnější: URL → URL
  • Přepisovací pravidla se nedědí Je potřeba dědění povolit

Simple redirection cases can be configured using Redirect directive (mod_alias)

Jednoduché případy lze nahradit pomocí Redirect (mod_alias)

Rewriting during request processing

Přepisování při zpracování požadavků

Rewrite as a part of request processing Rewrite as a part of request processing

Directives

Direktivy

  • Enable rewriting
    
    									RewriteEngine on|off
    								
    Context: server, virtualhost, directory, .htaccess

    Options FollowSymLinks must be enabled to use per-directory rewriting (for security reasons)

  • Rewriting rules (what)
    
    									RewriteRule Pattern Substitution [flags]
    									RewriteRule ^/somepath(.*) /otherpath$1 [R]
    								
  • Rewriting conditions (when)
    
    									RewriteCond TestString CondPattern
    									RewriteCond   %{TIME_HOUR}%{TIME_MIN} <0700
    									RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
    								
  • Povolení přepisování
    
    									RewriteEngine on|off
    								
    Kontext: server, virtualhost, directory, .htaccess

    Pro povolení přepisování uvnitř adresářů je nezbytné nastavení Options FollowSymLinks (z důvodů bezpečnosti)

  • Přepisovací pravidla (co)
    
    									RewriteRule Pattern Substitution [flags]
    									RewriteRule ^/somepath(.*) /otherpath$1 [R]
    								
  • Podmínky pravidel (kdy)
    
    									RewriteCond TestString CondPattern
    									RewriteCond   %{TIME_HOUR}%{TIME_MIN} <0700
    									RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
    								

Rewriting in .htaccess example

Ukázka přesměrování v .htaccess

Example of .htaccess file in CMS Drupal 8 in …/sites/default/files

Ukázka .htaccess souboru v CMS Drupal 8 ve …/sites/default/files


							RewriteEngine On

							# Address to be rewritten inside directory contains filename only;
							# therefore conditions are based on variables in this case

							# If request targets to CMS static file …
							RewriteCond expr "%{REQUEST_URI} -strmatch '/sites/default/files/*'"
							# … and requested file does not exist at the same time
							RewriteCond %{REQUEST_FILENAME} !-f
							# Redirect request to another server
							RewriteRule (.*) https://oldweb/sites/default/files/$1 [R]
						

							RewriteEngine On

							# Adresa pro přepis obsahuje pouze jméno souboru v adresáři
							# proto je potřeba v podmínkách použít proměnné

							# Pokud adresa směřuje do CMS na statický soubor
							RewriteCond expr "%{REQUEST_URI} -strmatch '/sites/default/files/*'"
							# A zároveň požadovaný soubor neexistuje
							RewriteCond %{REQUEST_FILENAME} !-f
							# Přesměruj požadavek na starý server
							RewriteRule (.*) https://oldweb/sites/default/files/$1 [R]
						

HTTP → HTTPS upgrade example

Ukázka přesměrování HTTP → HTTPS

Example of configuration that upgrades HTTP connection to HTTPS connection for addresses starting with /secure/ location

Ukázka konfigurace, která provede povýšení spojení z HTTP na HTTPS, pokud adresa začíná na /secure/


							# This will enable the Rewrite capabilities
							RewriteEngine On

							# This checks to make sure the connection is not already HTTPS
							RewriteCond %{HTTPS} !=on

							# This rule will redirect all users who are using any part of
							# /secure/ to the same location but using HTTPS.
							RewriteRule ^/?secure/(.*) https://%{SERVER_NAME}/secure/$1 [R,L]
						

							RewriteEngine On

							# Podmínka: pokud spojení není přes HTTPS
							RewriteCond %{HTTPS} !=on

							# Pak všechny adresy se začátkem /secure/ nebo secure/
							# budou přesměrovány na stejnou adresu, ale s HTTPS
							RewriteRule ^/?secure/(.*) https://%{SERVER_NAME}/secure/$1 [R,L]
						

Additional rewrite configuration

Další nastavení rewrite

  • Options setup (inheritance)
    
    									RewriteOptions Options
    								
    Context: server, virtualhost, directory, .htaccess
    • Inherit Disabled by default, more predictable behavior
      
      											RewriteOptions Inherit
      										
      Inherited rules are applied after current context rules
    • InheritBefore Likewise Inherit, but inherited rules are applied in advance
    • IgnoreInherit Ignoring inherited rules
  • Nastavení vlastností (dědění)
    
    									RewriteOptions Options
    								
    Kontext: server, virtualhost, directory, .htaccess
    • Inherit Standardně vypnuté, více předvídatelné chování
      
      											RewriteOptions Inherit
      										
      Zděděná pravidla se aplikují až po pravidlech daného kontextu
    • InheritBefore Jako Inherit, ale zděděná pravidla se aplikují před pravidly daného kontextu
    • IgnoreInherit Ignoruje zděděná pravidla

Logging

Logování

  • Log level setting during rewriting
    
    									LogLevel level
    								
    Range: ≤debug: nothing, >trace2: for debugging purposes only
    
    									LogLevel alert rewrite:trace3
    								
    
    									tail -f errorlog | fgrep '[rewrite:'
    								
  • Nastavení úrovně logování při přesměrování
    
    									LogLevel level
    								
    Rozsah: ≤debug: nic, >trace2: pouze pro účely ladění
    
    									LogLevel alert rewrite:trace3
    								
    
    									tail -f errorlog | fgrep '[rewrite:'
    								

Rewriting rules

Přepisovací pravidla

  • RewriteRule directive Rewrites original URL to new URL according to pattern
    
    									RewriteRule Pattern Substitution [flags]
    								
  • Substitution
    /var/www/newpathname (File-path)
    /imgAddress (URL-path)
    http://www.mycorp.net/newAbsolute URL
    Nothing (dash)
  • Back references
    $NNth RewriteRule subexpression
    %NNth RewriteCond subexpression
    %{VARNAME}Server variable
    ${mapname:key|default}Mapping function (with default value)
  • RewriteRule Přepíše původní adresu na novou adresu na základě vzoru
    
    									RewriteRule Pattern Substitution [flags]
    								
  • Substituce
    /var/www/newCesta (file-path)
    /imgAdresa (URL-path)
    http://www.mycorp.net/newAbsolutní URL
    Nic (pomlčka)
  • Zpětné reference
    $NN-tý podvýraz v RewriteRule
    %NN-tý podvýraz v RewriteCond
    %{VARNAME}Proměnná serveru
    ${mapname:key|default}Mapovací funkce (s výchozí hodnotou)

Rewriting flags

Přepisovací příznaky

  • chain|C Chain with next rule, if fails → skip chain Zřetězí s dalším pravidlem,
  • env|E=VAR:VAL Set environment variable Nastavuje proměnnou prostředí
  • forbidden|F Return 403 Forbidden response Vrací odpověď 403 Forbidden
  • last|L Last rule (skip the rest) Poslední pravidlo (další nezpracovává)
  • next|N Start over again from the top (!) Začne znova přepisovat od začátku (!)
  • nocase|NC Process in case-insensitive manner Zpracovává bez ohledu na velikost
  • noescape|NE Prevent URL encoding (%xx) Nepřevádí speciální znaky na %xx
  • proxy|P Force to use proxy (implies [L]) Vynucuje použití proxy (implikuje [L])
  • passthrough|PT Pass back through URL mapping Pošle zpět na WS→FS mapování
  • qsappend|QSA Append original query string to URL Připojí původní query string za URL
  • redirect|R [=code] Force (external) redirection Vynucuje externí přesměrování
  • skip|S=num Skip next num rules Přeskočí dalších num pravidel
  • type|T=MIME-type Set response MIME type Nastavuje MIME typ odpovědi

Flags usage examples

Ukázka použití příznaků

Forbid all characters in URL expect listed ones E.g. lowercase characters and / . ö ü

Zákaz všech znaků v adrese kromě vybraných Např.: malých písmen a / . ö ü


							RewriteEngine On
							RewriteRule "^([a-z/.]|\xc3\xb6|\xc3\xbc)+$" "-" [S=1]
							RewriteRule .* - [F]
						
öu00f6\xc3\xb6
üu00fc\xc3\xbc
ëu00eb\xc3\xab

Rewrite Base

  • Rewriting inside <Directory> or .htaccess processes rules for resources inside directory only
  • The pathname to directory is added after substitution (real)
  • If the real path does not match request pathname, use RewriteBase directive
    
    									RewriteBase URL-path
    								
    Context: directory, .htaccess
  • Při přepisování uvnitř <Directory> nebo .htaccess se vzor pravidla týká pouze daného adresáře
  • Po náhradě se přidá cesta k adresáři (skutečná)
  • Pokud předtím došlo k náhradě a skutečná cesta neodpovídá požadavku, použije se direktiva RewriteBase
    
    									RewriteBase URL-path
    								
    Kontext: directory, .htaccess
RewriteBase scheme

Rewrite map

Rewrite mapa

  • Rewritemap scheme RewriteMap directive Defines map function for rewriting
  • Map types
    • txttext file
    • rndtext file with random selection
    • dbmbinary file
    • intinternal function
    • prgexternal program
  • Map usage in RewriteRule (substitution)
    
    									${ MapName : LookupKey }
    									${ MapName : LookupKey | DefaultValue }
    								
    
    									RewriteMap examplemap txt:/path/to/file/map.txt
    									RewriteRule ^/ex/(.*) ${examplemap:$1}
    								
  • Rewritemap scheme RewriteMap Definuje mapu pro přepis
  • Typy mapy
    • txttextový soubor
    • rndtextový soubor s náhodným výběrem
    • dbmbinární soubor
    • intinterní funkce
    • prgexterní program
  • Použití v RewriteRule (substituci)
    
    									${ MapName : LookupKey }
    									${ MapName : LookupKey | DefaultValue }
    								
    
    									RewriteMap examplemap txt:/path/to/file/map.txt
    									RewriteRule ^/ex/(.*) ${examplemap:$1}
    								

More resources on rewriting

Další informace k přepisování