Sökmotoroptimerade bilder och ett centraliserat publiceringsverktyg

by Pierre on 05 juli 2009

Igår höll jag en längre stund på med att försöka få apache2, med PHP, förstå att bilder, filer och stylesheets ligger i en mapp under DirectoryRoot (mappen som är root för en websajt). Anledning att jag ville få detta att fungera är för ett centraliserat publiceringsverktyg. Flera sajter delar samma serverscript och kan därmed även använda samma designtemplates(sajtens utseende) för publiceringsverktyget möjliggör att man kan byta utseende på sin sajt. Det har också den fördelen att uppgraderingar av systemet kommer till nytta för alla sajter på en gång. I den nuvarande versionen av detta verktyg är bildurl´erna för de olika sajterna den samma dvs serverns ipnummer. En bild i systemet kan ha url´en http://79.112.133.1/files/image/34333.jpg. För att ytterligare förbättra sökmotoroptimeringen vill jag kunna ha bildlänkar som är http://www.sajt.se/14-bild-namn.jpg

Denna första lösningen som jag hade tänkt var använda var en RewriteRule i .htaccess som fångade upp bilder och berättade att deras källa fanns i en mapp under DirectoryRoot. Men detta ville inte fungera, jag fick bara 404 eller 500 fel men inte mycket mer att gå på. Efter många försök och några tårar kom jag på att alla fel som blir på sajten loggas i en errorfil (som jag specificerat i sajtens VirtualHost fil). Detta visste jag mycket väl om men den kunskapen pockade inte direkt på uppmärksamhet för tillfället. Av loggfilen gick tydligt att utläsa att det inte går att specificera mappar under DirectoryRoot. Apache2 tolkade alla mappdirektiv utifrån sajtensrot och efter ett tag gav jag upp detta.

När man löser problem blir det väldigt många sökningar på google och då dyker det upp mycket relaterade tips. Ett tänkbar lösning som dök upp var ett direktiv som heter Alias och går ut på att man helt flyttar var apache2 ska leta efter källan till de efterfrågade filerna. Vid detta lag var jag irriterad på att hela tiden på gå ut och in i loggfilen för att se den senaste felet. Då kom jag på en fiffig unix-funktion som jag använt tidigare, nämligen tail. Det är en funktion som gör att man kan visa x antal rader av slutet av en fil. Men ännu fiffigare är det med blir det med flaggan -f (follow) vilket innebär att x antal rader av slutet automatiskt uppdateras i din ssh konsol (vanligtvis putty).

tail exempeltail -f -n 10 /server_root/html_root/logs/sajt.se_error.log
Tillbaka till Alias som jag snabbt kom fram till inte var en möjligt. Eftersom Alias gäller för en hel mapp inte enstaka filer eller filtyper. Plus ett annat generalfel som upptäckte senare.

Alias exempelAlias /images /server_root/central/common_image_folder
Ovan direkt innebär att apache2 förväntar sig att källan till filer, som http://www.sajt.se/images/14-bildnamn.jpg, finns i mappen /server_root/central/common_image_folder på servern. Jag vill inte att bilderna ska ligga i en mapp utan direkt i webroten dvs http://www.sajt.se/14-bildnamn.jpg. Skulle jag köra ett Alias på webrooten så skulle det innebär att alla filer förväntas i målet för alias och det vill jag inte.

Nästa direktiv som jag då snubbla på var en släktning till Alias nämligen AliasMatch som nästan fungerar som RewriteRule fast fungerar även med mappar under webroten(DirectoryRoot). När jag väl testade detta så upptäckte jag i loggfilen att AliasMatch inte var tillåten .htaccess-filer och då inte heller Alias. Dessa måste ligga i apache2´s conf-filer eller i en VirtualHost specifikation. Eftersom jag har full kontroll över servern var det inga problem att specificera den där.

AliasMatch exempelAliasMatch (?i)^/([0-9]{1,})-.*?\.(jpg|jpeg|gif|png|bmp) /server_root/central/common_image_folder/$1.$2

Ovan är det regular expressions som gör susen och matchar endast bilder. (?i) betyder att matchningen inte ska vara versalkänsligt. Den andra delen i AliasMatch berättar i vilken mapp filerna finns i. $1.$2 är den första och den andra matchade parantesen i mönstret (pattern), och innebär att filen egentligen heter (en eller flera siffror) punkt (filändelse) tex 14-bildnamn.jpg blir till 14.jpg.

Samma lösning går givetvis att göra för vilka filer som helst som finns på en sajt. Jag behövde även ytterligare en lösning på detta problem som skulle användas för stylesheets som låg under centraliserade. Lösningen blev symlinks. Det är en symbolisk genväg för något, en fil eller en mapp till exempel. En symbolisk länk är något man skapar på servern. För att apache2 ska följa symboliska länkar krävs direktivet FollowSymLinks.

FollowSymLinks i VirtualHost<VirtualHost */>
DocumentRoot /server_root/html_root/sajt.se/
ErrorLog /server_root/html_root/logs/sajt.se_error.log
<Directory/>
FollowSymLinks
</Directory>
——Fler direktiv
<VirtualHost>

Efter detta skapar man en symlink från DirectoryRoot, i detta fallet /server_root/html_root/sajt.se/ som pekar på en mapp någonstans på servern.

SymLink exempelln -s /server_root/central/templates/template1/style.css /server_root/html_root/sajt.se/style.css

Oroa dig inte för att symlinken får 0777 som rättigheter eftersom det bara en symoblisk länk och det åndå målets rättigheter som gäller. Det inte att andra rättigheter för en symlink. Fördelen är att du inte behöver tänka på ägarskapet dvs om www-data (användaren som apache2 identifierar sig som på server) för köra filen eller inte. När filen http://www.sajt.se/style.css efterfrågas av en webläsare använder apache2 filen /server_root/central/templates/template1/style.css.

Jag kommer att ändra och skapa symobliska länkar via PHP med funktionen exec. På sätt kan man kodmässigt enkelt ändra tex design för en sajt. Exemplet visar hur borttagandet/skapande sker för en stylesheet fil.

exec exempelexec(”rm /server_root/html_root/sajt.se/style.css”);
exec(”ln -s /server_root/central/templates/template1/style.css /server_root/html_root/sajt.se/style.css”);

Första direktivet tar bort(rm) eventuell symlink och det andra lägger till ett nytt.

Denna lösning gör att publiceringsverktyget kan hosta flera sajter med gemensamma serverscrpit och då ha fördelen att uppdateringar sker samtidigt för alla sajter samt att det är enkelt att kodmässigt byta designmallar för en sajt. En kanske självklar sak, men ändå skapade mig problem, var att Alias och AliasMatch inte kunde användas i .htaccess. Det står väldigt tydligt i dokumentationsfilerna för Apache2 var ett direktiv kan användas. Kolla faktarutan som står högst upp före alla direktiv, context. Där står det i vilket sammanhang det kan användas.

Som en liten parantes vill jag påpeka att http://www.sajt.se inte är en sajt som jag äger och har inget med detta exempel att göra.

  • Share/Bookmark

Leave a Comment

Previous post: Bästa möjliga Adsense sajt

Next post: Gratis Spotify inbjudan