Skip to content

Latest commit

 

History

History
123 lines (99 loc) · 4 KB

File metadata and controls

123 lines (99 loc) · 4 KB

mediawiki-extensions-WikiDexFileRepository

Custom file repository that adds some virtual paths to file URLs, so they can be cached more efficiently (generating sort of permanent URLs), and change when a new version of the file is uploaded (using the file timestamp).

This extension requires custom rewrite rules on the web server to work.

Requires MediaWiki 1.34 or newer.

Typical URL of image: http://mycdn/mwuploads/wikisite1/thumb/a/ab/Example.png/200px-Example.png

URL of image with this extension: http://mycdn/mwuploads/wikisite1/thumb/a/ab/latest/20161231182410/Example.png/200px-Example.png

Installation

MediaWiki

Configuration in LocalSettings.php.

wfLoadExtension( 'WikiDexFileRepository' );
$wgLocalFileRepo = [
    'class' => 'LocalWikiDexRepo',
    'name' => 'local',
    'directory' => $wgUploadDirectory,
    'url' => $wgUploadBaseUrl ? $wgUploadBaseUrl . $wgUploadPath : $wgUploadPath,
    'hashLevels' => 2,
    'thumbScriptUrl' => $wgThumbnailScriptPath,
    'transformVia404' => true,
    'deletedDir' => $wgDeletedDirectory,
    'deletedHashLevels' => 3
];

Web Server

Configuration needed on the webserver to translate the URLs generated by the extension to actual file paths.

nginx

Rules for nginx.

Images are served from http://mycdn/mwuploads/wikisite1/ to allow for multiple MediaWiki installations on the same domain.

map $mwuploads_longcache $mwuploads_expire {
    default 5m;
    1 30d;
}

map $uri $images_thumbfallback {
    default @404;
    "~/mwuploads/wikisite1/" @thumb;
    "~/mwuploads/wikisite2/" @thumb;
}

map $uri $images_mwinstallpath {
    default "/dev/null";
    "~/mwuploads/wikisite1/" "/home/www/wikisite1/mediawiki-1.29.0";
    "~/mwuploads/wikisite2/" "/home/www/wikisite2/mediawiki-1.29.0";
}

map $request_uri $thumbfile {
    default "xx";
    "~/mwuploads/[a-z0-9]+/thumb/[0-9a-f]/[0-9a-f][0-9a-f]/latest/[0-9]+/(?<xthumbfile>[^/]+)/[0-9]+px-.*$" "$xthumbfile";
    "~/mwuploads/[a-z0-9]+/thumb/[0-9a-f]/[0-9a-f][0-9a-f]/(?<xthumbfile>[^/]+)/[0-9]+px-.*$" "$xthumbfile";
        "~/mwuploads/[a-z0-9]+/thumb/archive/[0-9a-f]/[0-9a-f][0-9a-f]/(?<xthumbfile>[^/]+)/[0-9]+px-.*$" "$xthumbfile";
}

server {
    location /mwuploads/ {
        alias /data/mwuploads/public/;
        expires $mwuploads_expire;

        # Image with /latest/timestamp/, gets rewritten, long expires
        location ~ "^/mwuploads/[a-z0-9]+/(?:thumb/)?[0-9a-f]/[0-9a-f][0-9a-f]/latest/[0-9]+/.*$" {
            set $mwuploads_longcache 1;
            expires $mwuploads_expire;
            rewrite "^/mwuploads/(?<startpath>[a-z0-9]+/(?:thumb/)?[0-9a-f]/[0-9a-f][0-9a-f]/)latest/[0-9]+/(?<endpath>.*)$" "/mwuploads/$startpath$endpath";
        }

        # Direct file in /archive, long expires
        location ~ "^/mwuploads/[a-z0-9]+/archive" {
            set $mwuploads_longcache 1;
            expires $mwuploads_expire;
        }
        # Thumb image
        # Warning: Regexp variables are used in @thumb
        location ~ "^/mwuploads/[a-z0-9]+/thumb/[0-9a-f]/[0-9a-f][0-9a-f]/[^/]+/(page(?<thumbpage>\d+)-)?(?<thumbwidth>[0-9]+)px-.*$" {
            set $thumbarchived 0;
            expires $mwuploads_expire;
            try_files $uri $images_thumbfallback;
        }
        # Thumb image from archive
        location ~ "^/mwuploads/[a-z0-9]+/thumb/archive/[0-9a-f]/[0-9a-f][0-9a-f]/[^/]+/(page(?<thumbpage>\d+)-)?(?<thumbwidth>[0-9]+)px-.*$" {
            set $mwuploads_longcache 1;
            set $thumbarchived 1;
            expires $mwuploads_expire;
            try_files $uri $images_thumbfallback;
        }
    }

    location @thumb {
        expires $mwuploads_expire;
        # Run the thumb.php script
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $images_mwinstallpath/thumb.php;
        fastcgi_param QUERY_STRING f=$thumbfile&width=$thumbwidth&p=$thumbpage&archived=$thumbarchived;
        fastcgi_pass unix:/run/php/php-fpm.sock;
    }

    location @404 {
        return 404;
    }

    location / {
        return 404;
    }

}