From 2afff59a8b1c59d32018944aef5fe46007dec2b2 Mon Sep 17 00:00:00 2001 From: Tom Gilder Date: Wed, 12 Oct 2005 03:12:40 +0000 Subject: [PATCH] (bug 2585) Return proper 404 code when pages don't exist --- RELEASE-NOTES | 2 +- includes/Article.php | 2 ++ includes/OutputPage.php | 58 ++++++++++++++++++++++++++++++++++++++-- includes/SpecialPage.php | 5 ++-- index.php | 8 ++++++ 5 files changed, 70 insertions(+), 5 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 7307e61fff..9fcca3d27e 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -144,7 +144,7 @@ fully support the editing toolbar, but was found to be too confusing. * (bug 3617) Update for portuguese language (pt) * Namespaces hacks on LanguagePl * New preferences design and reorganisation - +* (bug 2585) Return proper 404 code when pages don't exist === Caveats === diff --git a/includes/Article.php b/includes/Article.php index a0a0f8d787..c2af9b2eb2 100644 --- a/includes/Article.php +++ b/includes/Article.php @@ -1461,6 +1461,7 @@ class Article { if ( !$wgUseValidation ) # Are we using article validation at all? { + $wgOut->setStatusCode( 404 ); $wgOut->errorpage( "nosuchspecialpage", "nospecialpagetext" ); return ; } @@ -2429,6 +2430,7 @@ class Article { $fname = 'Article::info'; if ( !$wgAllowPageInfo ) { + $wgOut->setStatusCode( 400 ); $wgOut->errorpage( 'nosuchaction', 'nosuchactiontext' ); return; } diff --git a/includes/OutputPage.php b/includes/OutputPage.php index 0c24e8967d..638ec9b966 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -20,7 +20,7 @@ class OutputPage { var $mHeaders, $mCookies, $mMetatags, $mKeywords; var $mLinktags, $mPagetitle, $mBodytext, $mDebugtext; var $mHTMLtitle, $mRobotpolicy, $mIsarticle, $mPrintable; - var $mSubtitle, $mRedirect; + var $mSubtitle, $mRedirect, $mStatusCode; var $mLastModified, $mETag, $mCategoryLinks; var $mScripts, $mLinkColours; @@ -60,7 +60,8 @@ class OutputPage { function addHeader( $name, $val ) { array_push( $this->mHeaders, $name.': '.$val ) ; } function addCookie( $name, $val ) { array_push( $this->mCookies, array( $name, $val ) ); } function redirect( $url, $responsecode = '302' ) { $this->mRedirect = $url; $this->mRedirectCode = $responsecode; } - + function setStatusCode( $statusCode ) { $this->mStatusCode = $statusCode; } + # To add an http-equiv meta tag, precede the name with "http:" function addMeta( $name, $val ) { array_push( $this->mMetatags, array( $name, $val ) ); } function addKeyword( $text ) { array_push( $this->mKeywords, $text ); } @@ -442,7 +443,60 @@ class OutputPage { wfProfileOut( $fname ); return; } + elseif ( $this->mStatusCode ) + { + $statusMessage = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 307 => 'Temporary Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Timeout', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URI Too Large', + 415 => 'Unsupported Media Type', + 416 => 'Request Range Not Satisfiable', + 417 => 'Expectation Failed', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Timeout', + 505 => 'HTTP Version Not Supported', + 507 => 'Insufficient Storage' + ); + if ( $statusMessage[$this->mStatusCode] ) + header( 'HTTP/1.1 ' . $this->mStatusCode . ' ' . $statusMessage[$this->mStatusCode] ); + } # Buffer output; final headers may depend on later processing ob_start(); diff --git a/includes/SpecialPage.php b/includes/SpecialPage.php index 479ea14ec7..5a56b54fd6 100644 --- a/includes/SpecialPage.php +++ b/includes/SpecialPage.php @@ -257,8 +257,9 @@ class SpecialPage $retVal = $redir; } else { $wgOut->setArticleRelated( false ); - $wgOut->setRobotpolicy( "noindex,follow" ); - $wgOut->errorpage( "nosuchspecialpage", "nospecialpagetext" ); + $wgOut->setRobotpolicy( 'noindex,follow' ); + $wgOut->setStatusCode( 404 ); + $wgOut->errorpage( 'nosuchspecialpage', 'nospecialpagetext' ); $retVal = false; } } diff --git a/index.php b/index.php index 7ae4a8af9a..026f31fe89 100644 --- a/index.php +++ b/index.php @@ -112,6 +112,7 @@ if( !$wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) { wfSpecialSearch(); } else if( !$wgTitle or $wgTitle->getDBkey() == '' ) { $wgTitle = Title::newFromText( wfMsgForContent( 'badtitle' ) ); + $wgOut->setStatusCode( 404 ); $wgOut->errorpage( 'badtitle', 'badtitletext' ); } else if ( $wgTitle->getInterwiki() != '' ) { if( $rdfrom = $wgRequest->getVal( 'rdfrom' ) ) { @@ -124,6 +125,7 @@ if( !$wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) { $wgOut->redirect( $url ); } else { $wgTitle = Title::newFromText( wfMsgForContent( 'badtitle' ) ); + $wgOut->setStatusCode( 404 ); $wgOut->errorpage( 'badtitle', 'badtitletext' ); } } else if ( ( $action == 'view' ) && @@ -141,6 +143,10 @@ if( !$wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) { $wgTitle = Title::makeTitle( NS_IMAGE, $wgTitle->getDBkey() ); } + if ( !$wgTitle->exists() ) { + $wgOut->setStatusCode( 404 ); + } + $ns = $wgTitle->getNamespace(); // Namespace might change when using redirects @@ -166,6 +172,7 @@ if( !$wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) { } if ( in_array( $action, $wgDisabledActions ) ) { + $wgOut->setStatusCode( 404 ); $wgOut->errorpage( 'nosuchaction', 'nosuchactiontext' ); } else { switch( $action ) { @@ -254,6 +261,7 @@ if( !$wgDisableInternalSearch && !is_null( $search ) && $search !== '' ) { break; default: if (wfRunHooks('UnknownAction', array($action, $wgArticle))) { + $wgOut->setStatusCode( 404 ); $wgOut->errorpage( 'nosuchaction', 'nosuchactiontext' ); } } -- 2.20.1