* Attempt to detect redirect loops for the canonical title redirect, and
[lhc/web/wiklou.git] / includes / Wiki.php
index f613638..4fa421a 100644 (file)
@@ -71,7 +71,7 @@ class MediaWiki {
                
                
                if ( '' == $title && 'delete' != $action ) {
-                       $ret = Title::newFromText( wfMsgForContent( 'mainpage' ) );
+                       $ret = Title::newMainPage();
                } elseif ( $curid = $request->getInt( 'curid' ) ) {
                        # URLs like this are generated by RC, because rc_title isn't always accurate
                        $ret = Title::newFromID( $curid );
@@ -99,7 +99,7 @@ class MediaWiki {
                if( !is_null( $search ) && $search !== '' ) {
                        // Compatibility with old search URLs which didn't use Special:Search
                        // Do this above the read whitelist check for security...
-                       $title = Title::makeTitle( NS_SPECIAL, 'Search' );
+                       $title = SpecialPage::getTitleFor( 'Search' );
                }
                $this->setVal( 'Search', $search );
 
@@ -125,10 +125,10 @@ class MediaWiki {
                $action = $this->getVal('Action');
                if( !$this->getVal('DisableInternalSearch') && !is_null( $search ) && $search !== '' ) {
                        require_once( 'includes/SpecialSearch.php' );
-                       $title = Title::makeTitle( NS_SPECIAL, 'Search' );
+                       $title = SpecialPage::getTitleFor( 'Search' );
                        wfSpecialSearch();
                } else if( !$title or $title->getDBkey() == '' ) {
-                       $title = Title::makeTitle( NS_SPECIAL, 'Badtitle' );
+                       $title = SpecialPage::getTitleFor( 'Badtitle' );
                        # Die now before we mess up $wgArticle and the skin stops working
                        throw new ErrorPageError( 'badtitle', 'badtitletext' );
                } else if ( $title->getInterwiki() != '' ) {
@@ -141,16 +141,43 @@ class MediaWiki {
                        if ( !preg_match( '/^' . preg_quote( $this->getVal('Server'), '/' ) . '/', $url ) && $title->isLocal() ) {
                                $output->redirect( $url );
                        } else {
-                               $title = Title::makeTitle( NS_SPECIAL, 'Badtitle' );
+                               $title = SpecialPage::getTitleFor( 'Badtitle' );
                                throw new ErrorPageError( 'badtitle', 'badtitletext' );
                        }
                } else if ( ( $action == 'view' ) &&
                        (!isset( $this->GET['title'] ) || $title->getPrefixedDBKey() != $this->GET['title'] ) &&
                        !count( array_diff( array_keys( $this->GET ), array( 'action', 'title' ) ) ) )
                {
-                       /* Redirect to canonical url, make it a 301 to allow caching */
-                       $output->setSquidMaxage( 1200 );
-                       $output->redirect( $title->getFullURL(), '301');
+                       $targetUrl = $title->getFullURL();
+                       // Redirect to canonical url, make it a 301 to allow caching
+                       global $wgServer, $wgUsePathInfo;
+                       if( isset( $_SERVER['REQUEST_URI'] ) &&
+                               $targetUrl == $wgServer . $_SERVER['REQUEST_URI'] ) {
+                               $message = "Redirect loop detected!\n\n" .
+                                       "This means the wiki got confused about what page was " .
+                                       "requested; this sometimes happens when moving a wiki " .
+                                       "to a new server or changing the server configuration.\n\n";
+                               
+                               if( $wgUsePathInfo ) {
+                                       $message .= "The wiki is trying to interpret the page " .
+                                               "title from the URL path portion (PATH_INFO), which " .
+                                               "sometimes fails depending on the web server. Try " .
+                                               "setting \"\$wgUsePathInfo = false;\" in your " .
+                                               "LocalSettings.php, or check that \$wgArticlePath " .
+                                               "is correct.";
+                               } else {
+                                       $message .= "Your web server was detected as possibly not " .
+                                               "supporting URL path components (PATH_INFO) correctly; " .
+                                               "check your LocalSettings.php for a customized " .
+                                               "\$wgArticlePath setting and/or toggle \$wgUsePathInfo " .
+                                               "to true.";
+                               }
+                               wfHttpError( 500, "Internal error", $message );
+                               return false;
+                       } else {
+                               $output->setSquidMaxage( 1200 );
+                               $output->redirect( $targetUrl, '301');
+                       }
                } else if ( NS_SPECIAL == $title->getNamespace() ) {
                        /* actions that need to be made when we have a special pages */
                        SpecialPage::executePath( $title );
@@ -264,8 +291,14 @@ class MediaWiki {
         */
        function doUpdates ( &$updates ) {
                wfProfileIn( 'MediaWiki::doUpdates' );
+               $dbw =& wfGetDB( DB_MASTER );
                foreach( $updates as $up ) {
                        $up->doUpdate();
+
+                       # Commit after every update to prevent lock contention
+                       if ( $dbw->trxLevel() ) {
+                               $dbw->commit();
+                       }
                }
                wfProfileOut( 'MediaWiki::doUpdates' );
        }