Split apache404 into an independent plugin
Also make it ignore the 'do' parameter at Joey's suggestion, to have one less thing to remember when configuring.master
parent
fb0e3a7dbc
commit
46b880f839
|
@ -338,46 +338,6 @@ sub cgi_goto ($;$) {
|
|||
exit;
|
||||
}
|
||||
|
||||
sub cgi_page_from_404 ($$$) {
|
||||
my $path = shift;
|
||||
my $baseurl = shift;
|
||||
my $usedirs = shift;
|
||||
|
||||
# fail if missing from environment or whatever
|
||||
return undef unless defined $path;
|
||||
return undef unless defined $baseurl;
|
||||
|
||||
# with usedirs on, path is like /~fred/foo/bar/ or /~fred/foo/bar or
|
||||
# /~fred/foo/bar/index.html
|
||||
# with usedirs off, path is like /~fred/foo/bar.html
|
||||
# baseurl is like 'http://people.example.com/~fred'
|
||||
|
||||
# convert baseurl to ~fred
|
||||
unless ($baseurl =~ s{^https?://[^/]+/?}{}) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# convert path to /~fred/foo/bar
|
||||
if ($usedirs) {
|
||||
$path =~ s/\/*(?:index\.$config{htmlext})?$//;
|
||||
}
|
||||
else {
|
||||
$path =~ s/\.$config{htmlext}$//;
|
||||
}
|
||||
|
||||
# remove /~fred/
|
||||
unless ($path =~ s{^/*\Q$baseurl\E/*}{}) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# special case for the index
|
||||
unless ($path) {
|
||||
return 'index';
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
sub cgi (;$$) {
|
||||
my $q=shift;
|
||||
my $session=shift;
|
||||
|
@ -409,14 +369,7 @@ sub cgi (;$$) {
|
|||
# commenter are for compatibility with any saved URLs
|
||||
if ($do eq 'goto' || $do eq 'recentchanges_link' ||
|
||||
$do eq 'commenter') {
|
||||
my $page = undef;
|
||||
|
||||
if ($ENV{REDIRECT_STATUS} eq '404') {
|
||||
$page = cgi_page_from_404($ENV{REDIRECT_URL},
|
||||
$config{url}, $config{usedirs});
|
||||
}
|
||||
|
||||
cgi_goto($q, $page);
|
||||
cgi_goto($q);
|
||||
}
|
||||
|
||||
# Need to lock the wiki before getting a session.
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
#!/usr/bin/perl
|
||||
# Copyright © 2009 Simon McVittie <http://smcv.pseudorandom.co.uk/>
|
||||
# Licensed under the GNU GPL, version 2, or any later version published by the
|
||||
# Free Software Foundation
|
||||
package IkiWiki::Plugin::apache404;
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
use IkiWiki 3.00;
|
||||
|
||||
sub import {
|
||||
hook(type => "cgi", id => 'apache404', call => \&cgi);
|
||||
}
|
||||
|
||||
sub getsetup () {
|
||||
return
|
||||
plugin => {
|
||||
# not really a matter of safety, but enabling/disabling
|
||||
# through a web interface is useless - it needs web
|
||||
# server admin action too
|
||||
safe => 0,
|
||||
rebuild => 0,
|
||||
}
|
||||
}
|
||||
|
||||
sub cgi_page_from_404 ($$$) {
|
||||
my $path = shift;
|
||||
my $baseurl = shift;
|
||||
my $usedirs = shift;
|
||||
|
||||
# fail if missing from environment or whatever
|
||||
return undef unless defined $path;
|
||||
return undef unless defined $baseurl;
|
||||
|
||||
# with usedirs on, path is like /~fred/foo/bar/ or /~fred/foo/bar or
|
||||
# /~fred/foo/bar/index.html
|
||||
# with usedirs off, path is like /~fred/foo/bar.html
|
||||
# baseurl is like 'http://people.example.com/~fred'
|
||||
|
||||
# convert baseurl to ~fred
|
||||
unless ($baseurl =~ s{^https?://[^/]+/?}{}) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# convert path to /~fred/foo/bar
|
||||
if ($usedirs) {
|
||||
$path =~ s/\/*(?:index\.$config{htmlext})?$//;
|
||||
}
|
||||
else {
|
||||
$path =~ s/\.$config{htmlext}$//;
|
||||
}
|
||||
|
||||
# remove /~fred/
|
||||
unless ($path =~ s{^/*\Q$baseurl\E/*}{}) {
|
||||
return undef;
|
||||
}
|
||||
|
||||
# special case for the index
|
||||
unless ($path) {
|
||||
return 'index';
|
||||
}
|
||||
|
||||
return $path;
|
||||
}
|
||||
|
||||
sub cgi ($) {
|
||||
my $cgi=shift;
|
||||
|
||||
if ($ENV{REDIRECT_STATUS} eq '404') {
|
||||
my $page = cgi_page_from_404($ENV{REDIRECT_URL},
|
||||
$config{url}, $config{usedirs});
|
||||
IkiWiki::cgi_goto($cgi, $page);
|
||||
}
|
||||
}
|
||||
|
||||
1;
|
|
@ -1,10 +1,11 @@
|
|||
[[!meta title="Apache 404 handler"]]
|
||||
[[!template id=plugin name=apache404 author="[[Simon_McVittie|smcv]]"]]
|
||||
[[!tag type/useful]]
|
||||
|
||||
Sufficiently recent versions of IkiWiki can be used as an Apache 404 handler,
|
||||
This plugin lets you use the IkiWiki CGI script as an Apache 404 handler,
|
||||
to give the behaviour of various other wiki engines where visiting a
|
||||
nonexistent page provides you with a link to create it.
|
||||
|
||||
To achieve this, put something like this in the wiki's Apache configuration
|
||||
file:
|
||||
|
||||
ErrorDocument 404 /cgi-bin/ikiwiki.cgi?do=goto
|
||||
ErrorDocument 404 /cgi-bin/ikiwiki.cgi
|
|
@ -1,12 +1,14 @@
|
|||
#!/usr/bin/perl
|
||||
use warnings;
|
||||
use strict;
|
||||
use Test::More tests => 18;
|
||||
use Test::More tests => 17;
|
||||
|
||||
BEGIN { use_ok("IkiWiki"); }
|
||||
BEGIN { use_ok("IkiWiki::CGI"); }
|
||||
BEGIN { use_ok("IkiWiki::Plugin::apache404"); }
|
||||
|
||||
sub cgi_page_from_404 { return IkiWiki::cgi_page_from_404(shift, shift, shift); }
|
||||
sub cgi_page_from_404 {
|
||||
return IkiWiki::Plugin::apache404::cgi_page_from_404(shift, shift,
|
||||
shift);
|
||||
}
|
||||
|
||||
$IkiWiki::config{htmlext} = 'html';
|
||||
|
Loading…
Reference in New Issue