(bug 2585) Return proper 404 code when pages don't exist
authorTom Gilder <tomgilder@users.mediawiki.org>
Wed, 12 Oct 2005 03:12:40 +0000 (03:12 +0000)
committerTom Gilder <tomgilder@users.mediawiki.org>
Wed, 12 Oct 2005 03:12:40 +0000 (03:12 +0000)
RELEASE-NOTES
includes/Article.php
includes/OutputPage.php
includes/SpecialPage.php
index.php

index 7307e61..9fcca3d 100644 (file)
@@ -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 ===
 
index a0a0f8d..c2af9b2 100644 (file)
@@ -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;
                }
index 0c24e89..638ec9b 100644 (file)
@@ -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();
index 479ea14..5a56b54 100644 (file)
@@ -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;
                                }
                        }
index 7ae4a8a..026f31f 100644 (file)
--- 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' );
                                }
                }