tavis nörttimaailmassa

EksisONE - artikkeleita ja ohjeita nörttimaailmasta

Domainin vaihtuminen ja .htaccess

Aina silloin tällöin sivusto vaihtaa domaininsa muutossa. Silloin pitäisi saada automaattinen uudelleenohjaus vanhaan osoitteeseen saapuville kävijöille. Siirto kannattaisi ajoittaa niin, että ainakin puoli vuotta olisi molemmat domainit ja niiden tiedostopaikka hallussa. Vuosi olisi fiksuin. Domainin hinta ei ole, tai ei pitäisi olla, rajoite. Ne harvemmin maksavat niin paljon. Sen sijaan webhotellin hinta voikin olla kynnyskysymys ja teknisten ongelmien takia kulut ovat yleisin syy ylipäätään muuttaa. Siitä huolimatta muutto pitäisi ajoittaa niin, että edes jonkin ajan uusi ja vanha olisivat yhtä aikaa käytössä. Jos muutto tapahtuu suunnilleen samalla hetkellä, kun vanha loppuu ja uusi alkaa, niin uudelleenohjaukset tehdään sivustolla vain Googlen ja ulkoisten linkkien suhteen.

Edullisin tapa, monellakin tavalla, olisi hostata omat sivustonsa itse. Silloin ei käytetä webhotellia, vaan otetaan käyttöön VPS eli virtual private server. Yksi laajimmista, ja samalla edullisimmista, on DigitalOcean. Silloin itse muuttokin on helpoin, koska mitään muuta ei muuteta kuin web-serverin, kuten Apache2, tiedoista yksi rivi ja ajetaan vaikka WP-CLI:n avulla uusi osoite koko tietokantaan. Sitten tehdään vanhalle osoitteelle eli domainille uusi asennus web-serveriin – siihen urakkaan menee noin minuutti. Silloin on rinnakkain uusi ja vanha, ei tarvitse tehdä mitään sivustosiirtoja eikä tilaakaan kulu yhtään enempää. Uudelleenohjaus voidaan pitää paikallaan vaikka maailman tappiin asti ja toimii niin kauan kun omistaa vanhan domain-nimen.

Jos kuitenkin siirrät sivustot fyysisesti toiseen paikkaan, niin löydät täältä ohjeet WordPressin siirtoon webhotellista toiseen tai serveriltä toiselle, sekä Moodlen siirto-ohjeet.

Mutta tekee siirron millä tahansa tavalla mille tahansa asennukselle, niin se pitäisi tehdä. Syitä on kaksi:

  • käyttäjämukavuus, kun vastaan ei tule kuollutta sivustoa tai pitäisi napsutella jostain linkistä eteenpäin
  • hakukoneoptimointi eli SEO, jolloin vanhan sivuston arvo siirretään Googlen silmissä uudelle sivustolle ja saadaan
  • lisäarvona molempiin liittyen: googlen ja muiden hakukoneiden hakutulokset päivittyvät uudelle domainille

.htaccess ja uudelleenohjaus

Uudelleenohjaus uuteen domainen tehdään useimmiten.htaccess tiedostolla, mutta virtuaaliservereillä ohjaus laitetaan Apachen domain.com.conf tiedostoon. Se sijaitsee sivuston juuressa, eli esimerkiksi paikassa /var/www/html. Se on piilotiedosto, johon web-serveri aina kurkistaa, kun joku tulee sisälle juuri siihen urliin. Kun .htaccess -tiedostoon tehdään kääntö uuteen osoitteeseen, niin kävijän selain tekee välittömän käännöksen uuteen osoitteeseen. Hakukoneille kerrotaan, että kyseessä on error 301, eli pysyvästi muuttunut osoite, jolloin ne osaavat päivittää omat hakulistansa ja tulevaisuudessa olla tarjoamatta vanhaa osoitetta.

Ulkoisia linkkejä ja jakoja ei käytännössä pysty muuttamaan ja ne ohjaavat vanhaan osoitteeseen niin kauan kun ovat hengissä. Yksi internetin ikuisia lainalaisuuksia on, että

hyvät linkit eivät koskaan kuole

Tätä sääntöä valitettavasti rikotaan koko ajan, ja siksi jokainen meistä tuntee niin hyvin error 404 - not found ilmoituksen. Käytännössä aina kyse on täydellisestä piittaamattomuudesta kävijöitä kohtaan (joille sivut on tehty) sekä tekijä laiskuudesta. Edes osaamattomuuden taakse ei voi piiloutua, koska Googlen ensimmäisiä hakutuloksia on miten uudelleenohjaukset tehdään. Ainoa poikkeus sääntöön on totaalisesti kuolleet sivustot, joiden sisältö löytyy enintään Web Archivesta tai Googlen cachestä.

301 vai 302

Ennenkuin laitat uudelleenohjauksen paikalleen, niin tätä kannattaa miettiä.

301 on pysyvästi muuttunut osoite. Se kertoo niin Googlelle kuin kävijän selaimelle, että vanha unohdetaan ja nyt on voimassa uusi osoite. Käyttäjän kohdalla se tarkoittaa, että selain laittaa omaan välimuistiinsa tiedon ohjauksesta ja kävijä antaa vanhan osoitteen uudestaan, niin selain menee suoraan uuteen osoitteeseen.

302 on väliaikainen uudelleenohjaus ja niin Google kuin kävijäkin käyvät kerta toisensa jälkeen vanhassa osoitteessa katsomassa onko käännölle tapahtunut jotain.

Jos sinulla menee uudelleenohjaus peppulleen, niin Googlen kohdalla siitä seuraa myöhemmin vain ehkä 404:sia ja vaikka ohjaus osuisikin väärään artikkeliin, uuden paikan sitemap korjaa tilanteen ajan myötä. Mutta hetken aikaa ihmiset saattavat saada hakukoneesta vääriä hittejä. Tai jos sinulla on huippusuosittu ja monessa paikassa linkitettu artikkeli ”Miten vipstaakki kesytetään” ja ohjaatkin se sivulle ”Suomen huonoimmat sovinistivitsit”, niin saatat kärsiä SEO-arvossa.

Kävijän ja hänen selaimensa välimuistin kohdalla onkin sitten hankalampaa. Meillä ei nimittäin ole oikein mitään tapaa tyhjentää selaimen välimuistia. Etkä todellakaan halua laittaa saitin banneriin neuvoja miten satunnainen kävijä tyhjentää selaimensa välimuistit ja evästeet, että saisi oikean sisällön – trust me, olen ollut tilanteessa.

Siksi kannattaa ehkä ensin tehdä 302 kääntö ja kun on varma, että se toimii, niin vaihtaa 301:seksi. Se tarkoittaa sitä, että jokaisessa allaolevassa esimerkissä pitää 301 muuttaa muotoon 302.

Aina kun olet muuttanut conf-tiedostoa, niin tarvitaan systemctl restart apache2. Sen sijaan .htaccess-tiedostoa käytettäessä muutokset ovat heti käytössä-

WordPress

Jos sinulla on WordPress-asennus, niin laita aina kaikki uudelleenohjaukset ennen WordPressin omia osoitemuodon rakentavia uudelleenohjauksia. Jos laitat omat redirectisi WordPressin jälkeen, niin WordPress ottaa ohjat. Järjestyksellä on väliä.

Muokataan .htaccess

  • Tehdään ensin varmuuskopio vanhassa osoitteessa.
cp /var/www/html/.htaccess /var/www/html/.htaccess.backup
  • Jos homma menee pieleen ja haluat palauttaa vanhan, niin tee se vaikka näin:
rm /var/www/html/.htaccess
cp /var/www/html/.htaccess.backup /var/www/html/.htaccess
  • Avataan edelleen vanhassa osoitteessa pysyen.htaccess ja kopioi itsellesi sopiva vaihtoehto.
nano /var/www/html/.htaccess

Laita ennen uudelleenohjauksia tämä:

RewriteEngine on

Muokataan domain.com.conf

  • Tehdään varmuuskopio vanhassa osoitteessa.
cp /etc/apache2/sites-available/domain.com.conf /etc/apache2/sites-available/domain.com.conf.backup

Varmuuskopion palauttaminen tehdään aivan samoin kuin .htaccess -tiedoston kohdalla. Muuta polut ja tietodostonimet oikeiksi.

  • Avaa tiedosto.
nano /etc/apache2/sites-available/domain.com.conf

Kopioi alta itsellesi sopiva esimerkki, muuta domainit ja polut oikeiksi ja tallenna.

  • Tarkistetaan selvien virheiden varalta:
apache2ctl configtest
  • Kerro muutokset Apachelle:
systemctl reload apache2

Uudelleenohjaukset

Seuraavat esimerki ovat .htaccess tiedostolle, mutta sopivat sellaisenaan pienellä muutoksella suoraan Apachen käyttöön. Kun laitat ohjauksen domain.com.conf tiedostoon, niin laita se <Directory> .. </Directory> määritysten ulkopuolelle ja muuta tämä:


<IfModule mod_rewrite.c>

.. (joku redirect tähän)

</IfModule>

Tuo tarvitaan vain kun ohjaus tehdään Rewrite kommennolla. Jos käytät suoraa Redirect komentoa (siellä on pari esimerkkiä), niin et tarvitse <IfModule> rakennetta.

Jotta se toimisi, niin sinulla täytyy olla mod_rewrite otettuna käyttöön.

a2enmod rewrite
systemctl restart apache2

Kaikki uuteen vastaavalle sivulle

Osoite muuttuu vain domainin suhteen. Järkevin tapa, kun sivuston rakenne ei sinänsä muutu. Urlit siirtyvät myös eli kun kävijä tulee sivulle http(s)://vanha.comain.com/juttu/ niin hän siirtyy osoitteeseen http://uusi.domain.com/juttu

Jos haluat ohjata https-osoitteeseen, niin muuta RewriteRule.


RewriteEngine on
RewriteCond %{HTTP_HOST} ^vanha.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.vanha.com [NC]
RewriteRule ^(.*)$ http://uusi/$1 [L,R=301,NC]

Kaikki yhdelle sivulle

Ohjaus voidaan tehdä joko etusivulle tai laskeutumissivulle, jossa kerrotaan vaikka muuton syistä tai miten sivuston rakenne on muuttunut. Vaikka hyvät linkit eivät koskaan kuole, niin joskus koko sivuston rakenne muuttuu täysin – muutetaan vaikka Drupalista WordPressiin – jolloin uudelleenohjausten työmäärä sivukohtaisissa käännöissä yksin sivustoaan tekevälle alkaa olla liian suuri hyötyyn nähden.

Tämä on informatiivinen ohjaus kävijälle, jossa toivotaan, että hän etsisi itse tarvitsemansa sisällön. Ei hän etsi ja kävijän loppureaktio on sama kuin 404:lla, koska linkki ei antanut sitä mitä piti, mutta ainakin tietää, että muutto on tapahtunut.

Googlen suhteen ohjaus etusivulle olisi hieman parempi, mutta merkitys on silti vähäinen – kunhan sitemap on asetettu uudessa kuten kuuluu.


RewriteEngine On
RewriteRule .* http://uusi.domain.com/sivu/ [R=301,L]

Kaikki juurihakemistoon

Tämä on tyypillinen vajaasti toteutettu siirto, joka tehdään vain Googlelle. Tai laiskoille webmastereille.


RewriteEngine On
RewriteRule ^$ http://uusi.domain.com/ [R=301,L]

Tämä on vielä helpompi tapa kääntää koko domain:


Redirect 301 / http://uusi.domain.com/

Voit käyttää samoja myös hakemiston kääntöön, kun lisäät sen polkuun. Esimerkiksi jos siirrät blogin hakemistoon tai WordPressin urlissa näkyvä kategoria muuttuu – tuohon on helpompaa käyttää jotain redirect-lisäosaa, joka automatisoi uudelleenohjauksen. Rank Math on hyvä, ja antaa SEO:n kaupan päälle.

Tämä kääntää uuteen hakemistoon kuljettaen myös pyydettävän sivun:


Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*)/vanha-hakemisto/(.*)$ $1/uusihakemisto/$2 [R=301,L]

Ei-www käännetään www-alkuun


RewriteEngine on
RewriteBase /
rewritecond %{http_host} ^domain.com [nc]
rewriterule ^(.*)$ http://www.domain.com/$1 [r=301,nc]

Koko url, mukaanlukien kyselyparametrit

Joskus on tarve uudelleenohjata vanhasta täysin samaan uuteen osoitteeseen niin, että kyselyparametrit (query string) liikuu mukana.


Options +FollowSymLinks
RewriteEngine On
RewriteRule ^(.*) http://www.newdomain.com%{REQUEST_URI} [R=302,NC]

http ohjataan https-alkuun

Osassa virtuaaliserverien asennuksia tämä saattaa rikkoa Let’s Encryptin certbotin toiminnan, koska se yrittää hakea portin 80 kautta uusittavan SSL-sertifikaatin ja https-liiikenne kulkee portin 443 kautta.


RewriteEngine on
RewriteCond %{HTTPS} on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Muuttunut sivu

Tätä voi käyttää esimerkiksi muuttuneen sisällön ohjaamiseen. Käännetään vain yksi määrätty sivu uuteen osoitteeseen


Redirect 301 /sivu.php http://www.domain.com/uusinimi.php

Esimerkki uudelleenohjauksesta

Uudelleenohjaus, kun domain ei muutu

Yksi säännöllisesti kysytty asia on, että miten ohjaus tehdään, kun domain pysyy samana, mutta sivusto muuttaa uudelle serverille tai webhotelliin.

Hyvät uutiset ovat, että ei mitenkään. Ei ole tarvetta tehdä mitään uudelleenohjauksia, koska ei Googlea tai käyttäjää kiinnosta missä sivut ovat. Niitä kiinnostaa vain sivuston osoite, url, eikä se muutu kun domain ei muutu.