Mod_rewrite - Apache URL manipulation


Mod_rewrite - förord

Guiden behandlar mod_rerite - en Apache teknik som tillåter mycket avancerad URL manipulation.
Om du inte hittar vad du söker här, så bör du konsultera Apaches officiella dokumentation för Mod_rewrite version 1.3 eller 2.0, beroende på vilken version du har installerat.
Regexp är det språk som används för att beteckna olika mönster. T.ex. så betyder "[0-9]{2,}" ett tal med minst 2 siffror och uttrycket "boll(ar)?" ordet boll och ordet bollar.
Vi rekommenderat starkt att du lär dig regexp, vilket du kommer ha nytta av dagligen när du programerar.
En mycket lättsam regexp guide finns på Robotwisdom och ett stort referensverk finns att ses på Wikipedia. Konsultera även gärna Google.

Om du har någon fundering eller någon fråga, så får du gärna skriva ett inlägg i vårt mod_rewrite forum där vi gärna svarar dig. Se dock till att beskriva ditt problem noggrant, så att vi kan ge dig ett svar direkt.

Apache inställningar

Register globals

Det finns en del galna php inställningar, en av dem är register_globals.
Detta inställning gör att http://domain.se/?person=5 sätter värdet 5 inte bara på variabeln $_POST['person'] utan även på variabeln $person.
Om du t.ex. kontrollerar att någon har loggat in och hämtar konfidentiell information om personen med hjälp av varibeln $person, där du lagrar personnummret för den inloggade, så kan vem som hellst hacka dig genom att skriva /?person=[personummer] som adress.
Denna inställning passar sig inte på någon php sida och bör därför stängas av.
Lösning: i htaccess kan vi stänga av inställningen:

php_flag register_globals 0

PHPSESSID session variabler

PHP sparar session variabler för att kunna särskilja olika besökare. Dessa variabler sparas oftas som Cookies på besökarens dator - men ibland även i URL parametern PHPSESSID (http://domain.se?PHPSESSID=[slumpad text]).
Denna PHPSESSID utgör ett säkerhetshot då någon kan stjäla variabeln från besökaren samt även ett problem för sökmotorerna som inte gillar URL paramatrar.
Lösning: Vi använder de tillgängliga .htaccess kommandona för att endast tillåta cookie sessions.
php_flag session.use_trans_sid off
php_flag session.use_only_cookies on
Notera att detta gör så att man behöver tillåta cookies för att t.ex. logga in på din webbplats - men då allternativet är totalt värdelöst så är detta en nakdel man får ta!

Göm dina mapp index

Som standard så visas mapp index ofta. Genom att t.ex. besöka http://domain.se/mapp1/ kan okända besökare alltå ofta få listor på alla filer som ligger i mappen. Detta är helt klart väldigt negativt, du vill bestämma vilka filer som besökaren får se och när.
Mapp index är ofta ett problem då t.ex. listor i "/bilder/ mappen ofta tjäls av andra site-ägare.
Lösning: Vi stänger helt enkelt av alla mapp-index i början av vår .htaccess-fil:

Options -Indexes

Externa redirects - skicka besökaren vidare

WWW

Sedan för några år sedan, då fler sökmotorer gjorde sina dubplicate filters striktare, så har det uppstått ett problem. Google med många andra kan ibland missuppfatta en webbplats och tro att http://domain.se är en annan site än http://www.domain.se - vilket oftast inte är fallet. Detta uppstår ofta t.ex. när sidorna har ett väldigt dynamiskt innehåll, t.ex. på grund av RSS nyheter eller liknande. Även om Google under senaste uppdateringen förminskat detta problem, så kvarstår det alltjämt för vissa siter. Problemet orsakar även ofta att statistik blir felaktig då varje sida kan ha fler än 1 adress, t.ex. http://domain.se/sida.html och http://www.domain.se/sida.html. Detta problem uppstår i istortsätt ALLA statistikskript - även för de med licenser på över 100 000sek/år.
Lösning: Vi löser det med en enkel redirect som skickar vidare alla besökare med en 301 redirect (permanently moved).

rewriteCond %{HTTP_HOST} ^domain\.se
rewriteRule ^(.*)$ http://www.domain.se/$1 [R=301,L]

Egen 404-sida

En Custom 404 sida kan ofta ge ett seriöst intryck, den kan även användas för att registrera 404 besöket och meddela administratörerna.
Lösning: Vi ser till att ingen fil hittats och att ingen mod_rewrite gjorts, sedan skickar vi besökaren till vår egna 404 sida.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* 404sida.php [QSA,L]

Våra rewrite vilkor betyder som följer:
!-f en fil med namnet får inte ha hittats
!-d adressen får inte vara en mapp
!-l adressen får inte vara en "symbolisk länk" (som leder till en fungerande fil)

Flytta en fil på hemsidan

Om du flyttar din fil som kommer all trafik som skickas till den gamla länken att förloras då de får en "sidan kan inte visas" skylt och återvänder till där de var.
Sökmotorerna tar den nya adressen som en ny fil och all den gamla respekten och ranken kommer att förloras.
Lösning: Med 301 redirect berättar du för alla besökare inklusive sökmotorerna att filen flyttats:

RewriteRule ^gammalt_filnamn\.html$ nytt_filnamn.html [R=301,L]

Flytta en mapp på hemsidan

Precis som när du flyttar en fil så måste du berätta för sökmotorer och besökare att din mapp har flyttats och vart de nu kan hitta mappen och dess filer. Lösning: Återigen använder vi oss av 301:

RewriteRule ^gammal_mapp/(.*)$ ny_mapp/$1 [R=301,L]

Med ovan kod kommer alla besökare skickas vidare från den gamla mappen till den nya, om någon t.ex. försöker hämta filen http://domain.se/gammal_mapp/sida.html så kommer de skickas vidare och hämta filen från den nya mappen http://domain.se/ny_mapp/sida.html

Mod_rewrite beroende på IP

Neka filaccess

Ibland skall visa filer endast kunna inkluderas från servern och inte visas som enskilda filer.
Med mod_rewrite så kan du neka access till alla filer med en specifik filändelse eller med ett specifikt filnamn. Vi gör ett exempel där vi vill neka access till våra filer med filändelserna .tpl och .inc
Lösning: Vi använder oss av "<Files>" kommandot

<Files ~ "\.(inc|tpl)$">
Order deny,allow
Deny from all
</Files>
Detta innebär att alla filer som slutar på .inc eller .tpl nekas access för alla förutom servern själv i interna includes.

Neka enskilda IPn

Ofta har man ett fåtal rötägg som förstör på sidorna, spammar forumen eller liknande. Att blocka deras IP är oftast den bästa lösningen.
Lösning: Vi använder oss av "<Files>":

<Files ~ ".*">
Order allow,deny
Allow from all
Deny from [ip nummer här]
</Files>

Access till utvalt IP

Vissa sidor skall endast kunna kommas åt av specifika personer, med deras IPn så kan man se till att endast de kan komma åt sidorna.
Lösning: Vi använder oss av "<Files>":

<Files ~ ".*">
Order deny,allow
Deny from all
Allow from [ip nummer här]
</Files>

Interna omskrivningar av adresser

Byta filändelse

Man kan av många anledningar vilja byta eller helt ta bort filändelsen på sina filer. T.ex. om man vill kunna använda länkar i stil med http://domain.se/registrera istället för http://www.domain.se/registrera.php. Lösning: För att göra detta kan vi använda oss av följande mod_rewrite:

RewriteRule ^([^\/\.]+)$ $1.php
Detta innebär att alla sidförfrågningar till adresser som inte har en filändelser kommer att ges filändelsen .php. D.v.s att http://domain.se/[vadsomhellst] kommer att köras som filen http://domain.se/[vadsomhellst].php
Vill man att alla php filer skall kunna kommas åt med [filnamn].html istället för [filnamn].php

RewriteRule ^([^\/\.]+)\.html$ $1.php
.html kan kan bytas ut till vilken filändelse man vill använda som hellst och .php kan självfallet vara t.ex. asp beroende på vilket format man skriver sina serverside skript i.

Statiska URLs

Sökmotorer föredrar alltid adresser som saknar query strings, alltså variabler efter '?'-tecken. http://domain.se/id2 är alltså bättre än http://domain.se/?id=2.
Lösning: För att uppnå detta kan vi använda adresser i stil med http://domain.se/id2 och internt skriva om dem till http://domain.se/?id=2 med följande kod:

RewriteRule ^id([0-9]*)$ index.php?id=$1 [QSA]
$1 hänvisar till värdet i den första parametern, i det här fallet alltså id nummret.
[QSA] står för Query String Append och innebär att andra variabler efter frågetecknet inte raderas utan behålls.

Exempelfil .htaccess

Här följer ett exempel på hur en htaccess kan se ut, den använder endast kommandon som vi tagit upp ovan.

# Endast cookies skall användas för att spara sessions
php_flag session.use_trans_sid off
php_flag session.use_only_cookies on

# ?variabel=5 skall endast sparas i $_POST['variabel'], inte även i $variabel
php_flag register_globals 0

# Ingen skall få se index över vilka filer som finns i serverns olika mappar
Options -Indexes

# .inc och .tpl filer får inte öppnas av någon besökare
<Files ~ "\.(inc|tpl)">
Order deny,allow
Deny from all
</Files>

# Endast IP nummret 235.124.51.61 får öppna sidor på servern
<Files ~ "\.*">
Order deny,allow
Deny from all
Allow from 235.124.51.61
</Files>

# Vi sätter på motorn för URL manipulation RewriteEngine On

# Alla frågor efter domain.se skickar besökaren vidare till www.domain.se
rewriteCond %{HTTP_HOST} ^domain\.se
rewriteRule ^(.*)$ http://www.domain.se/$1 [R=301,L]

# En mapp som vi flyttat
RewriteRule ^gammal_mapp/(.*)$ ny_mapp/$1 [R=301,L]

# En fil som vi flyttat
RewriteRule ^gammalt_filnamn\.html$ nytt_filnamn.html [R=301,L]

# Vi vill visa vår egen sida, 404sida.php, om ingen sida kunde hittas.
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule .* 404sida.php [QSA,L]

Slutord

Denna Apache mod_rewrite guide skall ses som ett komplement till officiell dokumentation. För att lära dig första varje enskit kommando eller flagga så bör du konsultera Apache.org.



kommenteraKommentarer    Antal 0    Medelpoäng 0/10

Bli medlem för att kunna skriva kommentarer!
Logga in om du redan är medlem.


Copyright © 2005 webbdesign.info    Cookies    Gratis statistik till hemsida    sitemap Webbdesign sitemap icon
Använd gärna våra RSS feeds:

Artikel Feed
[XML]
Forum Feed
[XML]

Svenska webhosts:
Svenska Webhotell

Använd gärna denna länk för att länka till oss:

Ny översättning:
Swedish affiliate programs

Är du medlem och vill synas här?
Hör av dig i vårt forum