[wp-trac] [WordPress Trac] #14904: Install page not redirecting to wp-admin/ on IIS6

WordPress Trac wp-trac at lists.automattic.com
Tue Sep 28 05:13:16 UTC 2010

#14904: Install page not redirecting to wp-admin/ on IIS6
 Reporter:  knutsp           |       Owner:                 
     Type:  defect (bug)     |      Status:  new            
 Priority:  normal           |   Milestone:  Awaiting Review
Component:  Upgrade/Install  |     Version:  3.0.1          
 Severity:  normal           |    Keywords:                 
Changes (by knutsp):

  * keywords:  reporter-feedback =>


 Now I think I can explain this issue a bit deeper.  On my system the
 server software is Microsoft-IIS/6.0.

 In pluggable.php I find this:
 function wp_redirect($location, $status = 302) {
         global $is_IIS;
         $is_IIS = TRUE;
         $location = apply_filters('wp_redirect', $location, $status);
         $status = apply_filters('wp_redirect_status', $status, $location);

         if ( !$location ) // allows the wp_redirect filter to cancel a
                 return false;

         $location = wp_sanitize_redirect($location);

         if ( $is_IIS ) {
                 header("Refresh: 0;url=$location");
         } else {
                 if ( php_sapi_name() != 'cgi-fcgi' )
                         status_header($status); // This causes problems on
 IIS and some FastCGI setups
                 header("Location: $location", true, $status);
 The first thing is that his means that in case the server is IIS the
 redirect method should be the "Refresh" header. Othwerwise the redirect
 method should be the "Location" header. This is strange, because the
 Location header also works on IIS.

 The second thing is that the $is_IIS variable is not initialized inside
 wp-includes/load.php, as this is required from wp-settings.php before the
 vars.php is requierd. In case the blog is not installed yet, but a wp-
 config.php is present, the redirection to wp-admin/install.php is done
 from wp-includes/load.php. This means that the redirect method used for
 any server is the Location header.

 The third thing is that, on my system, when a redirect is done with a
 '''relative''' URL, the redirect is done "internally". This means that the
 browser will not know that actual resource served to it. But, strangely,
 the IIS log file shows the actual wp-admin/install.php as being requested.
 This is very, very strange to me, and I have no explaination. I have no
 other IIS6 systems to etst this on.

 The fourth thing, and this is the main reason (and bug?), is that
 WP_SITEURL is not defined in wp-includes/load.php, as long as it's not
 defined in wp-config.php. This means that the redirection location will
 miss the site part and be relative. Combined with the undefined $is_IIS
 the redirect will fail. From load.php:
 function wp_not_installed() {
         if ( is_multisite() ) {
                 if ( ! is_blog_installed() && ! defined( 'WP_INSTALLING' )
                         wp_die( __( 'The site you have requested is not
 installed properly. Please contact the system administrator.' ) );
         } elseif ( ! is_blog_installed() && false === strpos(
 $_SERVER['PHP_SELF'], 'install.php' ) && !defined( 'WP_INSTALLING' ) ) {
                 if ( defined( 'WP_SITEURL' ) )
                         $link = WP_SITEURL . '/wp-admin/install.php';
                 elseif ( false !== strpos( $_SERVER['PHP_SELF'], 'wp-
 admin' ) )
                         $link = preg_replace( '|/wp-admin/?.*?$|', '/',
 $_SERVER['PHP_SELF'] ) . 'wp-admin/install.php';
                         $link = preg_replace( '|/[^/]+?$|', '/',
 $_SERVER['PHP_SELF'] ) . 'wp-admin/install.php';
                 require( ABSPATH . WPINC . '/kses.php' );
                 require( ABSPATH . WPINC . '/pluggable.php' );
                 require( ABSPATH . WPINC . '/formatting.php' );
                 wp_redirect( $link );

 '''I suggest:'''

 1. Remove the "Refresh" redirection method from wp_redirect, as I cannot
 see the need for this, and it's not a standard header. I qoute from
 [http://php.net/manual/en/function.header.php]: «frank farmer 04-Aug-2010
 02:10 in response to marcel dot glacki at stud dot fh-swf dot de

 The "refresh" header in your example is not part of the HTTP standard, it
 was a proprietary extension invented by Netscape.  It's use is discouraged
 by the W3C.»

 Then we can remove the $is_IIS test from wp-redirect and it doesn't need
 to be defined there.

 2. Rearrange the loading or constant definition sequence, or move the
 wp_not_installed function declaration, so that WP_SITEURL is defined at
 the time of declaration of wp_not_installed(). This will ensure that a
 redirection location never is a relative URL. A "Location" header should
 always have an "absoluteURI".

 I have also investigated this on IIS7 (Windows Server 2008) and there is
 no problem with relative URLs in a Location header. This is why this
 problem seems only to affect IIS6.

Ticket URL: <http://core.trac.wordpress.org/ticket/14904#comment:6>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software

More information about the wp-trac mailing list