↓ Archives ↓

Posts Tagged → apache

mod_rewrite og MediaWiki

Jeg har lige smidt en wiki på shoporama.dk, og i forbindelse med det ville jeg have nogle pænere adresser. De guides jeg fandt var ikke specielt gode, så her er hvordan jeg fiksede det:

.htaccess i roden af sitet:

  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule (.*) index.php/$1 [L,QSA]

I LocalSettings.php

  $wgScriptPath  = "";
  $wgArticlePath = "/$1";
  $wgUsePathInfo = true;

Download med mod_rewrite

En af mine kammerater har et script der laver en filoversigt, og han havde brug for at lave et download-link, der fik browseren til at hente filen, og ikke bare vise den. Filerne var billeder og videoer.

En løsning kunne være at køre filen igennem php, og så sætte nogle headere, men det var også lidt grimt synes jeg. En anden måde var at få Apache til at sætte nogle headere der bare gjorde at alle billeder, videoer m.m. blev downloadet i stedet.

Problemet var så bare, at så virkede det almindelige link ikke. Jeg skulle altså finde en løsning hvor jeg kunne angive på en bestemt URL at den skulle downloades.

Løsningen blev et mod_rewrite trick:

RewriteEngine on
RewriteCond %{QUERY_STRING} download
RewriteRule \.(mov|mp4)$    -    [T=application/octet-stream]

Jeg kigger på om QUERY_STRING er “download”, og hvis den er det, så tilføjer jeg headeren “application/octet-stream” til filen. Ret simpelt :-)

At redirecte til ‘-‘ er en speciel syntax der fortæller at mod_rewrite ikke skal redirecte.

Ovenstående bevirker at foo.mov bliver vist i browseren, men foo.mov?download bliver downloaded :-)

Hastighed og requests

Der er altid et overhead ved at browseren kalder serveren for at hente et stylesheet, javascript eller billede (og andre ting self.)

Jeg vil ikke gennemgå de tekniske løsninger (de kommer senere), men jeg vil komme med nogle idéer til hvordan man kan mindske de kald browseren laver. Typisk laver en browser to simultane kald til samme host-navn, så hvis du har mange billeder m.m. kan det påvirke load-tiden betydeligt.

Første finte er stylesheet og javascript. Tit ser man at html-sider loader flere stylesheets og flere javascript på samme side — hvilket også giver god mening, da det er smart at adskille ting. Problemer er bare at det ikke er super for performance, da browseren skal kalde serveren hver gang (vi ser bort fra cachede filer, keep-alive osv.)

Min løsning (som også er en del at det framework jeg arbejder på) er at samle filerne i én fil, og loade den. Jeg gør det med et smarty-plugin, så min kode kan fx se ud som følgende:

1
2
3
4
5
6
7
8
...
<head>
  <{css file="default.css"}>
  <{css file="style.css"}>
 
  <{css}>
</head>
...

Min css-funktion samler de så stylesheets og når funktionen kaldes uden argumenter bliver linien:

1
2
  <link type="text/css" rel="stylesheet"
   href="css.php?default.css,style.css"/>

Filen css.php er lidt mere kompliceret ind dette indlæg tillader, men den indeholder dels noget sikkerhedscheck, så folk ikke bare output’er vilkårlige filer, men også noget caching, samt check for If-modified-since-headere.

Man skal holde tungen lige i munden når man laver css.php-scriptet, da php gør hvad den kan for at browseren ikke cacher scriptet.

Outputtet fra scriptet bør gzip’es. Dette kan gøres på php- eller .htaccess-niveau med mod_deflate.

Om et par dage kommer jeg med næste finte, og det vedrører billeder på ens site. Især ikoner.