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
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
];
Configuration needed on the webserver to translate the URLs generated by the extension to actual file paths.
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;
}
}