Kapsin logo

Kapsi Internet-käyttäjät ry

Uudelleenohjaukset mod_rewrite:llä

Apachen mod_rewrite-laajennoksella on mahdollista toteuttaa erilaisia uudelleenohjauksia www-sivuilla. Tässä ohjeessa on esimerkkejä yleisimpiin tapauksiin sopivista rewrite-säännöistä.

Kaikki seuraavat asetukset tehdään .htaccess-tiedostoon, jonka hakemisto valitaan tilanteen mukaan. Tiedostoa haetaan siitä hakemistosta, johon selaimen osoiterivillä näkymä polku viittaa.

Jotta mod_rewriteä voi käyttää, on .htaccess-tiedoston alkuun lisättävä määrite sen käyttämisestä. Lisääksi voi antaa asetuksia, joilla määritellään mod_rewriten toimintaa yleisemmin, esimerkiksi RewriteOptions ja RewriteBase -määritteillä.

RewriteEngine On

RewriteRule-sääntöjen ensimmäinen osa on regexp-lauseke. Regexpissä piste tarkoittaa mitä tahansa merkkiä, joten on suositeltavaa lisätä pisteiden eteen kenoviiva estämään tämä. Muuten esimerkiksi teksti index.php täsmäisi myös nimeen index-php.

HTTPS:n pakottaminen käyttöön

# Uudelleeenohjaus http -> https
RewriteEngine On
RewriteCond %{ENV:HTTPS} !on
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Mikäli haluat varmistaa HTTPS:n käytön myös alihakemistoon asennettun Wordpressin tai jokin muun oman .htaccess -tiedostonsa sisältävän ohjelmiston osalta, niin RewriteOptions InheritDownBefore -asetuksella saa määrättyä ylähakemiston Rewrite-määritteet ajettaviksi ennen alihakemistoon lisättyjä määritteitä. Muussa tapauksessa vain alihakemistossa määritellyt Rewrite-säännöt tulevat tulkituiksi.
# Uudelleeenohjaus http -> https, joka periytyy myös alihakemistojen .htaccess Rewrite-määritteisiin
RewriteEngine On
RewriteOptions InheritDownBefore
RewriteCond %{ENV:HTTPS} !on
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

HTTPS:n pakottaminen pois käytöstä

# Uudelleenohjaus https -> http
RewriteEngine On
RewriteCond %{ENV:HTTPS} on
RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

Uudelleenohjaus toiseen osoitteeseen

Yksittäisestä tiedostosta toiselle nimelle:

RewriteRule nimi1\.html$ nimi2.html [R]

Yksittäisestä tiedostosta ulkoiseen osoitteeseen:

RewriteRule tiedosto\.html$ http://domain.com/tiedosto.html [R]

Kaikki kansion tiedostot vastaavilla nimillä ulkoiseen osoitteeseen:

RewriteRule ^(.*)$ http://domain.com/$1 [R]

Jos uudelleenohjauksen ei halua näkyvän selaimen osoiterivillä, voi paikallisissa ohjauksissa jättää lopusta tekstin "[R]" pois.

URL-osoitteiden siistiminen

Dynaamisia sivuja varten käytetään usein yhtä tiedostoa, esimerkiksi index.php, jolle sivun nimi välitetään parametrina. Seuraava sääntö muuttaa esimerkiksi osoitteen etusivu.html php-skriptiä varten muotoon index.php?page=etusivu:

RewriteRule ^(.*)\.html$ index.php?page=$1

Toinen tapa on ohjata alihakemistot suoraan php-ohjelman perään, jolloin polku on luettavissa muuttujasta $_SERVER['PATH_INFO'].

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1

Erilliset sivut alidomainille

Kapsin ylläpidolta voi pyytää ns. staattisen alidomainin, jolle saa siten muusta domainista erilliset sivut. Ylläpito luo alidomainin sivuja varten hakemiston ~/sites/alidomain.domain.com/www, kuten itse domainillekin on luotu. Katso lisää domain-ohjeesta.

Jos kuitenkin haluat hallita alidomainejasi itse, onnistuu se mod_rewrite:n avulla, mutta tällöin esimerkiksi Let's Encryptin sertifikaatteja ja sitä myötä HTTPS-yhteyksiä ei voi käyttää muille kuin ylläpidolle ilmoitettujen osoitteiden kanssa.

Jotta alidomainin luominen itse olisi mahdollista, on osoitteen jo valmiiksi ohjattava domainin sivuille. Ohjautuvuus on helppo testata selaimella: Mikäli saat domain.com:n sivut, kaikki on kunnossa. Jos taas saat virheilmoituksen, täytyy ylläpidon lisätä nimipalveluihin tai www-palvelimeen sopiva ohjaus. Mikäli nimipalvelusi ovat Kapsilla, voit pyytää ylläpidolta ohjauksen *.domain.com -> domain.com. Muiden palveluntarjoajien hallintatyökaluissa tämä on usein nimellä "wildcard".

Seuraava sääntö näyttää domainia alidomain.domain.com varten sivut hakemistosta alidomain (joka täytyy luonnollisesti luoda itse):

RewriteCond %{HTTP_HOST} ^alidomain\.domain\.com
RewriteCond %{REQUEST_URI} !^/alidomain/
RewriteRule ^(.*)$ /alidomain/$1 [L]

Alidomainin uudelleenohjaus

Pelkän uudelleenohjauksen alidomainia varten voi luoda seuraavasti:

RewriteCond %{HTTP_HOST} ^alidomain\.domain\.com
RewriteRule ^(.*)$ http://www.ohjatutsivut.com/$1 [R]

Alidomainia koskevat säännöt on sijoitettava www-juurihakemistossa sijaitsevaan .htaccess -tiedostoon.

Sovelluspalvelimet

Sovelluspalvelimen (eli sovelluksen oman HTTP-palvelimen) voi käynnistää esim webapp-bullseye-palvelimella. Käytettävä portti tulee pyytää ylläpidolta. Sovelluspalvelimen voi käynnistää cronista @reboot-aikamääritteellä tai käyttämällä systemd user uniteja (linkki johtaa Englannin kieliseen sivuun), jolloin se käynnistyy automaattisesti jos palvelin uudelleenkäynnistetään. Sovelluspalvelimen saa näkyviin Internetiin lisäämällä .htaccessiin ohjauksen sovelluspalvelimelle Kapsin sisäverkossa, esimerkiksi seuraavasti:

  DirectoryIndex disabled
  RewriteEngine On
  RewriteRule ^(.*)$ http://webapp-bullseye.n.kapsi.fi:PORTTI/$1 [P]

PORTTI pitää korvata ylläpidolta saadulta portilla.

Huomaathan, että sinun itse huolehdittava itse asennettujen sovelluksen päivitysten seuraamisesta ja asentamisesta! Älä luota myöskään siihen, että sovelluspalvelimeltasi ei voisi ladata muita sivuja kuin olet rewritella sallinut, sillä palvelimilla on tuhansia muita paikallisia käyttäjiä.

Jotta Djangon tekemät edelleenohjaukset toimisivat oikein, tulee djangon asetuksiin lisätä USE_X_FORWARDED_HOST = True. Tällöin sovelluspalvelin käyttää edelleenohjatessa alkuperäisessä kyselyssä käytettyä osoitetta eikä redirectissä käytettyä sisäverkon osoitetta.

Websocket erikoisuudet

Näiden sääntöjen järjestyksellä on merkitystä, eli ilman näitä ylimpiä ei websocketit toimi oikein millään koska Apachen täytyy käsitellä ne oikein.

RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^(.*) ws://webapp-bullseye.n.kapsi.fi:PORTTI/$1 [P]

RewriteRule ^(.*)$ http://webapp-bullseye.n.kapsi.fi:PORTTI/$1 [P]

PORTTI pitää korvata ylläpidolta saadulta portilla.