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.