]> scripts.mit.edu Git - autoinstalls/wordpress.git/blob - wp-admin/network.php
Wordpress 3.1.2-scripts
[autoinstalls/wordpress.git] / wp-admin / network.php
1 <?php
2 /**
3  * Network installation administration panel.
4  *
5  * A multi-step process allowing the user to enable a network of WordPress sites.
6  *
7  * @since 3.0.0
8  *
9  * @package WordPress
10  * @subpackage Administration
11  */
12
13 define( 'WP_NETWORK_ADMIN_PAGE', true );
14
15 /** WordPress Administration Bootstrap */
16 require_once( './admin.php' );
17
18 if ( ! is_super_admin() )
19         wp_die( __( 'You do not have sufficient permissions to manage options for this site.' ) );
20
21 if ( is_multisite() ) {
22         if ( ! is_network_admin() ) {
23                 wp_redirect( network_admin_url( 'setup.php' ) );
24                 exit;
25         }
26         if ( ! defined( 'MULTISITE' ) )
27                 wp_die( __( 'The Network creation panel is not for WordPress MU networks.' ) );
28 }
29
30 // We need to create references to ms global tables to enable Network.
31 foreach ( $wpdb->tables( 'ms_global' ) as $table => $prefixed_table )
32         $wpdb->$table = $prefixed_table;
33
34 /**
35  * Check for an existing network.
36  *
37  * @since 3.0.0
38  * @return Whether a network exists.
39  */
40 function network_domain_check() {
41         global $wpdb;
42         if ( $wpdb->get_var( "SHOW TABLES LIKE '$wpdb->site'" ) )
43                 return $wpdb->get_var( "SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1" );
44         return false;
45 }
46
47 /**
48  * Allow subdomain install
49  *
50  * @since 3.0.0
51  * @return bool Whether subdomain install is allowed
52  */
53 function allow_subdomain_install() {
54         $domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'siteurl' ) );
55         if( false !== strpos( $domain, '/' ) || 'localhost' == $domain || preg_match( '|[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+|', $domain ) )
56                 return false;
57
58         return true;
59 }
60 /**
61  * Allow subdirectory install
62  *
63  * @since 3.0.0
64  * @return bool Whether subdirectory install is allowed
65  */
66 function allow_subdirectory_install() {
67         global $wpdb;
68         if ( apply_filters( 'allow_subdirectory_install', false ) )
69                 return true;
70
71         if ( defined( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL )
72                 return true;
73
74         $post = $wpdb->get_row( "SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'" );
75         if ( empty( $post ) )
76                 return true;
77
78         return false;
79 }
80 /**
81  * Get base domain of network.
82  *
83  * @since 3.0.0
84  * @return string Base domain.
85  */
86 function get_clean_basedomain() {
87         if ( $existing_domain = network_domain_check() )
88                 return $existing_domain;
89         $domain = preg_replace( '|https?://|', '', get_option( 'siteurl' ) );
90         if ( $slash = strpos( $domain, '/' ) )
91                 $domain = substr( $domain, 0, $slash );
92         return $domain;
93 }
94
95 if ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) )
96         wp_die( __( 'You must define the <code>WP_ALLOW_MULTISITE</code> constant as true in your wp-config.php file to allow creation of a Network.' ) );
97
98 if ( is_network_admin() ) {
99         $title = __( 'Network Setup' );
100         $parent_file = 'settings.php';
101 } else {
102         $title = __( 'Create a Network of WordPress Sites' );
103         $parent_file = 'tools.php';
104 }
105
106 add_contextual_help($current_screen,
107         '<p>' . __('This screen allows you to configure a network as having subdomains (<code>site1.example.com</code>) or subdirectories (<code>example.com/site1</code>). Subdomains require wildcard subdomains to be enabled in Apache and DNS records, if your host allows it.') . '</p>' .
108         '<p>' . __('Choose subdomains or subdirectories; this can only be switched afterwards by reconfiguring your install. Fill out the network details, and click install. If this does not work, you may have to add a wildcard DNS record (for subdomains) or change to another setting in Permalinks (for subdirectories).') . '</p>' .
109         '<p>' . __('The next screen for Network will give you individually-generated lines of code to add to your wp-config.php and .htaccess files. Make sure the settings of your FTP client make files starting with a dot visible, so that you can find .htaccess; you may have to create this file if it really is not there. Make backup copies of those two files.') . '</p>' .
110         '<p>' . __('Add a <code>blogs.dir</code> directory under <code>/wp-content</code> and add the designated lines of code to wp-config.php (just before <code>/*...stop editing...*/</code>) and <code>.htaccess</code> (replacing the existing WordPress rules).') . '</p>' .
111         '<p>' . __('The choice of subdirectory sites is disabled if this setup is more than a month old because of permalink problems with &#8220;/blog/&#8221; from the main site. This disabling will be addressed soon in a future version.') . '</p>' .
112         '<p><strong>' . __('For more information:') . '</strong></p>' .
113         '<p>' . __('<a href="http://codex.wordpress.org/Create_A_Network" target="_blank">Documentation on Creating a Network</a>') . '</p>' .
114         '<p>' . __('<a href="http://codex.wordpress.org/Tools_Network_SubPanel" target="_blank">Documentation on the Network Screen</a>') . '</p>' .
115         '<p>' . __('<a href="http://wordpress.org/support/" target="_blank">Support Forums</a>') . '</p>'
116 );
117
118 include( ABSPATH . 'wp-admin/admin-header.php' );
119 ?>
120 <div class="wrap">
121 <?php screen_icon('tools'); ?>
122 <h2><?php echo esc_html( $title ); ?></h2>
123
124 <?php
125 /**
126  * Prints step 1 for Network installation process.
127  *
128  * @todo Realistically, step 1 should be a welcome screen explaining what a Network is and such. Navigating to Tools > Network
129  *      should not be a sudden "Welcome to a new install process! Fill this out and click here." See also contextual help todo.
130  *
131  * @since 3.0.0
132  */
133 function network_step1( $errors = false ) {
134         global $is_apache;
135
136         if ( get_option( 'siteurl' ) != get_option( 'home' ) ) {
137                 echo '<div class="error"><p><strong>' . __('Error:') . '</strong> ' . sprintf( __( 'Your <strong>WordPress address</strong> must match your <strong>Site address</strong> before creating a Network. See <a href="%s">General Settings</a>.' ), esc_url( admin_url( 'options-general.php' ) ) ) . '</p></div>';
138                 echo '</div>';
139                 include ( ABSPATH . 'wp-admin/admin-footer.php' );
140                 die();
141         }
142
143         if ( defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) {
144                 echo '<div class="error"><p><strong>' . __('Error:') . '</strong> ' . __( 'The constant DO_NOT_UPGRADE_GLOBAL_TABLES cannot be defined when creating a network.' ) . '</p></div>';
145                 echo '</div>';
146                 include ( ABSPATH . 'wp-admin/admin-footer.php' );
147                 die();
148         }
149
150         $active_plugins = get_option( 'active_plugins' );
151         if ( ! empty( $active_plugins ) ) {
152                 echo '<div class="updated"><p><strong>' . __('Warning:') . '</strong> ' . sprintf( __( 'Please <a href="%s">deactivate your plugins</a> before enabling the Network feature.' ), admin_url( 'plugins.php?plugin_status=active' ) ) . '</p></div><p>' . __( 'Once the network is created, you may reactivate your plugins.' ) . '</p>';
153                 echo '</div>';
154                 include( ABSPATH . 'wp-admin/admin-footer.php' );
155                 die();
156         }
157
158         $hostname = get_clean_basedomain();
159         $has_ports = strstr( $hostname, ':' );
160         if ( ( false !== $has_ports && ! in_array( $has_ports, array( ':80', ':443' ) ) ) ) {
161                 echo '<div class="error"><p><strong>' . __( 'Error:') . '</strong> ' . __( 'You cannot install a network of sites with your server address.' ) . '</p></div>';
162                 echo '<p>' . sprintf( __( 'You cannot use port numbers such as <code>%s</code>.' ), $has_ports ) . '</p>';
163                 echo '<a href="' . esc_url( admin_url() ) . '">' . __( 'Return to Dashboard' ) . '</a>';
164                 echo '</div>';
165                 include( ABSPATH . 'wp-admin/admin-footer.php' );
166                 die();
167         }
168
169         echo '<form method="post" action="">';
170
171         wp_nonce_field( 'install-network-1' );
172
173         $error_codes = array();
174         if ( is_wp_error( $errors ) ) {
175                 echo '<div class="error"><p><strong>' . __( 'ERROR: The network could not be created.' ) . '</strong></p>';
176                 foreach ( $errors->get_error_messages() as $error )
177                         echo "<p>$error</p>";
178                 echo '</div>';
179                 $error_codes = $errors->get_error_codes();
180         }
181
182         if ( WP_CONTENT_DIR != ABSPATH . 'wp-content' )
183                 echo '<div class="error"><p><strong>' . __('Warning!') . '</strong> ' . __( 'Networks may not be fully compatible with custom wp-content directories.' ) . '</p></div>';
184
185         $site_name = ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes ) ) ? $_POST['sitename'] : sprintf( _x('%s Sites', 'Default network name' ), get_option( 'blogname' ) );
186         $admin_email = ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes ) ) ? $_POST['email'] : get_option( 'admin_email' );
187         ?>
188         <p><?php _e( 'Welcome to the Network installation process!' ); ?></p>
189         <p><?php _e( 'Fill in the information below and you&#8217;ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step.' ); ?></p>
190         <?php
191
192         if ( isset( $_POST['subdomain_install'] ) ) {
193                 $subdomain_install = (bool) $_POST['subdomain_install'];
194         } elseif ( apache_mod_loaded('mod_rewrite') ) { // assume nothing
195                 $subdomain_install = true;
196         } elseif ( !allow_subdirectory_install() ) {
197                 $subdomain_install = true;
198         } else {
199                 $subdomain_install = false;
200                 if ( $got_mod_rewrite = got_mod_rewrite() ) // dangerous assumptions
201                         echo '<div class="updated inline"><p><strong>' . __( 'Note:' ) . '</strong> ' . __( 'Please make sure the Apache <code>mod_rewrite</code> module is installed as it will be used at the end of this installation.' ) . '</p>';
202                 elseif ( $is_apache )
203                         echo '<div class="error inline"><p><strong>' . __( 'Warning!' ) . '</strong> ' . __( 'It looks like the Apache <code>mod_rewrite</code> module is not installed.' ) . '</p>';
204                 if ( $got_mod_rewrite || $is_apache ) // Protect against mod_rewrite mimicry (but ! Apache)
205                         echo '<p>' . __( 'If <code>mod_rewrite</code> is disabled, ask your administrator to enable that module, or look at the <a href="http://httpd.apache.org/docs/mod/mod_rewrite.html">Apache documentation</a> or <a href="http://www.google.com/search?q=apache+mod_rewrite">elsewhere</a> for help setting it up.' ) . '</p></div>';
206         }
207
208         if ( allow_subdomain_install() && allow_subdirectory_install() ) : ?>
209                 <h3><?php esc_html_e( 'Addresses of Sites in your Network' ); ?></h3>
210                 <p><?php _e( 'Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories. <strong>You cannot change this later.</strong>' ); ?></p>
211                 <p><?php _e( 'You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality.' ); ?></p>
212                 <?php // @todo: Link to an MS readme? ?>
213                 <table class="form-table">
214                         <tr>
215                                 <th><label><input type='radio' name='subdomain_install' value='1'<?php checked( $subdomain_install ); ?> /> <?php _e( 'Sub-domains' ); ?></label></th>
216                                 <td><?php printf( _x( 'like <code>site1.%1$s</code> and <code>site2.%1$s</code>', 'subdomain examples' ), $hostname ); ?></td>
217                         </tr>
218                         <tr>
219                                 <th><label><input type='radio' name='subdomain_install' value='0'<?php checked( ! $subdomain_install ); ?> /> <?php _e( 'Sub-directories' ); ?></label></th>
220                                 <td><?php printf( _x( 'like <code>%1$s/site1</code> and <code>%1$s/site2</code>', 'subdirectory examples' ), $hostname ); ?></td>
221                         </tr>
222                 </table>
223
224 <?php
225         endif;
226
227                 $is_www = ( 0 === strpos( $hostname, 'www.' ) );
228                 if ( $is_www ) :
229                 ?>
230                 <h3><?php esc_html_e( 'Server Address' ); ?></h3>
231                 <p><?php printf( __( 'We recommend you change your siteurl to <code>%1$s</code> before enabling the network feature. It will still be possible to visit your site using the <code>www</code> prefix with an address like <code>%2$s</code> but any links will not have the <code>www</code> prefix.' ), substr( $hostname, 4 ), $hostname ); ?></h3>
232                 <table class="form-table">
233                         <tr>
234                                 <th scope='row'><?php esc_html_e( 'Server Address' ); ?></th>
235                                 <td>
236                                         <?php printf( __( 'The internet address of your network will be <code>%s</code>.' ), $hostname ); ?>
237                                 </td>
238                         </tr>
239                 </table>
240                 <?php endif; ?>
241
242                 <h3><?php esc_html_e( 'Network Details' ); ?></h3>
243                 <table class="form-table">
244                 <?php if ( 'localhost' == $hostname ) : ?>
245                         <tr>
246                                 <th scope="row"><?php esc_html_e( 'Sub-directory Install' ); ?></th>
247                                 <td><?php
248                                         _e( 'Because you are using <code>localhost</code>, the sites in your WordPress network must use sub-directories. Consider using <code>localhost.localdomain</code> if you wish to use sub-domains.' );
249                                         // Uh oh:
250                                         if ( !allow_subdirectory_install() )
251                                                 echo ' <strong>' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';
252                                 ?></td>
253                         </tr>
254                 <?php elseif ( !allow_subdomain_install() ) : ?>
255                         <tr>
256                                 <th scope="row"><?php esc_html_e( 'Sub-directory Install' ); ?></th>
257                                 <td><?php
258                                         _e( 'Because your install is in a directory, the sites in your WordPress network must use sub-directories.' );
259                                         // Uh oh:
260                                         if ( !allow_subdirectory_install() )
261                                                 echo ' <strong>' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';
262                                 ?></td>
263                         </tr>
264                 <?php elseif ( !allow_subdirectory_install() ) : ?>
265                         <tr>
266                                 <th scope="row"><?php esc_html_e( 'Sub-domain Install' ); ?></th>
267                                 <td><?php _e( 'Because your install is not new, the sites in your WordPress network must use sub-domains.' );
268                                         echo ' <strong>' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>';
269                                 ?></td>
270                         </tr>
271                 <?php endif; ?>
272                 <?php if ( ! $is_www ) : ?>
273                         <tr>
274                                 <th scope='row'><?php esc_html_e( 'Server Address' ); ?></th>
275                                 <td>
276                                         <?php printf( __( 'The internet address of your network will be <code>%s</code>.' ), $hostname ); ?>
277                                 </td>
278                         </tr>
279                 <?php endif; ?>
280                         <tr>
281                                 <th scope='row'><?php esc_html_e( 'Network Title' ); ?></th>
282                                 <td>
283                                         <input name='sitename' type='text' size='45' value='<?php echo esc_attr( $site_name ); ?>' />
284                                         <br /><?php _e( 'What would you like to call your network?' ); ?>
285                                 </td>
286                         </tr>
287                         <tr>
288                                 <th scope='row'><?php esc_html_e( 'Admin E-mail Address' ); ?></th>
289                                 <td>
290                                         <input name='email' type='text' size='45' value='<?php echo esc_attr( $admin_email ); ?>' />
291                                         <br /><?php _e( 'Your email address.' ); ?>
292                                 </td>
293                         </tr>
294                 </table>
295                 <?php submit_button( __( 'Install' ), 'primary', 'submit' ); ?>
296         </form>
297         <?php
298 }
299
300 /**
301  * Prints step 2 for Network installation process.
302  *
303  * @since 3.0.0
304  */
305 function network_step2( $errors = false ) {
306         global $base, $wpdb;
307         $hostname = get_clean_basedomain();
308
309         if ( ! isset( $base ) )
310                 $base = trailingslashit( stripslashes( dirname( dirname( $_SERVER['SCRIPT_NAME'] ) ) ) );
311
312         // Wildcard DNS message.
313         if ( is_wp_error( $errors ) )
314                 echo '<div class="error">' . $errors->get_error_message() . '</div>';
315
316         if ( $_POST ) {
317                 if ( allow_subdomain_install() )
318                         $subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true;
319                 else
320                         $subdomain_install = false;
321         } else {
322                 if ( is_multisite() ) {
323                         $subdomain_install = is_subdomain_install();
324 ?>
325         <p><?php _e( 'The original configuration steps are shown here for reference.' ); ?></p>
326 <?php
327                 } else {
328                         $subdomain_install = (bool) $wpdb->get_var( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'" );
329 ?>
330         <div class="error"><p><strong><?php _e('Warning:'); ?></strong> <?php _e( 'An existing WordPress network was detected.' ); ?></p></div>
331         <p><?php _e( 'Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables.' ); ?></p>
332 <?php
333                 }
334         }
335
336         if ( $_POST || ! is_multisite() ) {
337 ?>
338                 <h3><?php esc_html_e( 'Enabling the Network' ); ?></h3>
339                 <p><?php _e( 'Complete the following steps to enable the features for creating a network of sites.' ); ?></p>
340                 <div class="updated inline"><p><?php
341                         if ( file_exists( ABSPATH . '.htaccess' ) )
342                                 printf( __( '<strong>Caution:</strong> We recommend you back up your existing <code>wp-config.php</code> and <code>%s</code> files.' ), '.htaccess' );
343                         elseif ( file_exists( ABSPATH . 'web.config' ) )
344                                 printf( __( '<strong>Caution:</strong> We recommend you back up your existing <code>wp-config.php</code> and <code>%s</code> files.' ), 'web.config' );
345                         else
346                                 _e( '<strong>Caution:</strong> We recommend you back up your existing <code>wp-config.php</code> file.' );
347                 ?></p></div>
348 <?php
349         }
350 ?>
351                 <ol>
352                         <li><p><?php
353                                 printf( __( 'Create a <code>blogs.dir</code> directory at <code>%s/blogs.dir</code>. This directory is used to store uploaded media for your additional sites and must be writeable by the web server.' ), WP_CONTENT_DIR );
354                                 if ( WP_CONTENT_DIR != ABSPATH . 'wp-content' )
355                                         echo ' <strong>' . __('Warning:') . ' ' . __( 'Networks may not be fully compatible with custom wp-content directories.' ) . '</strong';
356                         ?></p></li>
357                         <li><p><?php printf( __( 'Add the following to your <code>wp-config.php</code> file in <code>%s</code> <strong>above</strong> the line reading <code>/* That&#8217;s all, stop editing! Happy blogging. */</code>:' ), ABSPATH ); ?></p>
358                                 <textarea class="code" readonly="readonly" cols="100" rows="7">
359 define( 'MULTISITE', true );
360 define( 'SUBDOMAIN_INSTALL', <?php echo $subdomain_install ? 'true' : 'false'; ?> );
361 $base = '<?php echo $base; ?>';
362 define( 'DOMAIN_CURRENT_SITE', '<?php echo $hostname; ?>' );
363 define( 'PATH_CURRENT_SITE', '<?php echo $base; ?>' );
364 define( 'SITE_ID_CURRENT_SITE', 1 );
365 define( 'BLOG_ID_CURRENT_SITE', 1 );</textarea>
366 <?php
367         $keys_salts = array( 'AUTH_KEY' => '', 'SECURE_AUTH_KEY' => '', 'LOGGED_IN_KEY' => '', 'NONCE_KEY' => '', 'AUTH_SALT' => '', 'SECURE_AUTH_SALT' => '', 'LOGGED_IN_SALT' => '', 'NONCE_SALT' => '' );
368         foreach ( $keys_salts as $c => $v ) {
369                 if ( defined( $c ) )
370                         unset( $keys_salts[ $c ] );
371         }
372         if ( ! empty( $keys_salts ) ) {
373                 $keys_salts_str = '';
374                 $from_api = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
375                 if ( is_wp_error( $from_api ) ) {
376                         foreach ( $keys_salts as $c => $v ) {
377                                 $keys_salts_str .= "\ndefine( '$c', '" . wp_generate_password( 64, true, true ) . "' );";
378                         }
379                 } else {
380                         $from_api = explode( "\n", wp_remote_retrieve_body( $from_api ) );
381                         foreach ( $keys_salts as $c => $v ) {
382                                 $keys_salts_str .= "\ndefine( '$c', '" . substr( array_shift( $from_api ), 28, 64 ) . "' );";
383                         }
384                 }
385                 $num_keys_salts = count( $keys_salts );
386 ?>
387         <p><?php
388                 echo _n( 'This unique authentication key is also missing from your <code>wp-config.php</code> file.', 'These unique authentication keys are also missing from your <code>wp-config.php</code> file.', $num_keys_salts ); ?> <?php _e( 'To make your installation more secure, you should also add:' ) ?></p>
389         <textarea class="code" readonly="readonly" cols="100" rows="<?php echo $num_keys_salts; ?>"><?php echo esc_textarea( $keys_salts_str ); ?></textarea>
390 <?php
391         }
392 ?>
393 </li>
394 <?php
395         if ( iis7_supports_permalinks() ) :
396
397                         if ( $subdomain_install ) {
398                                 $web_config_file =
399 '<?xml version="1.0" encoding="UTF-8"?>
400 <configuration>
401     <system.webServer>
402         <rewrite>
403             <rules>
404                 <rule name="WordPress Rule 1" stopProcessing="true">
405                     <match url="^index\.php$" ignoreCase="false" />
406                     <action type="None" />
407                 </rule>
408                 <rule name="WordPress Rule 2" stopProcessing="true">
409                     <match url="^files/(.+)" ignoreCase="false" />
410                     <action type="Rewrite" url="wp-includes/ms-files.php?file={R:1}" appendQueryString="false" />
411                 </rule>
412                 <rule name="WordPress Rule 3" stopProcessing="true">
413                     <match url="^" ignoreCase="false" />
414                     <conditions logicalGrouping="MatchAny">
415                         <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
416                         <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
417                     </conditions>
418                     <action type="None" />
419                 </rule>
420                 <rule name="WordPress Rule 4" stopProcessing="true">
421                     <match url="." ignoreCase="false" />
422                     <action type="Rewrite" url="index.php" />
423                 </rule>
424             </rules>
425         </rewrite>
426     </system.webServer>
427 </configuration>';
428                         } else {
429                                 $web_config_file =
430 '<?xml version="1.0" encoding="UTF-8"?>
431 <configuration>
432     <system.webServer>
433         <rewrite>
434             <rules>
435                 <rule name="WordPress Rule 1" stopProcessing="true">
436                     <match url="^index\.php$" ignoreCase="false" />
437                     <action type="None" />
438                 </rule>
439                 <rule name="WordPress Rule 2" stopProcessing="true">
440                     <match url="^([_0-9a-zA-Z-]+/)?files/(.+)" ignoreCase="false" />
441                     <action type="Rewrite" url="wp-includes/ms-files.php?file={R:2}" appendQueryString="false" />
442                 </rule>
443                 <rule name="WordPress Rule 3" stopProcessing="true">
444                     <match url="^([_0-9a-zA-Z-]+/)?wp-admin$" ignoreCase="false" />
445                     <action type="Redirect" url="{R:1}wp-admin/" redirectType="Permanent" />
446                 </rule>
447                 <rule name="WordPress Rule 4" stopProcessing="true">
448                     <match url="^" ignoreCase="false" />
449                     <conditions logicalGrouping="MatchAny">
450                         <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
451                         <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
452                     </conditions>
453                     <action type="None" />
454                 </rule>
455                 <rule name="WordPress Rule 5" stopProcessing="true">
456                     <match url="^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*)" ignoreCase="false" />
457                     <action type="Rewrite" url="{R:2}" />
458                 </rule>
459                 <rule name="WordPress Rule 6" stopProcessing="true">
460                     <match url="^([_0-9a-zA-Z-]+/)?(.*\.php)$" ignoreCase="false" />
461                     <action type="Rewrite" url="{R:2}" />
462                 </rule>
463                 <rule name="WordPress Rule 7" stopProcessing="true">
464                     <match url="." ignoreCase="false" />
465                     <action type="Rewrite" url="index.php" />
466                 </rule>
467             </rules>
468         </rewrite>
469     </system.webServer>
470 </configuration>';
471                         }
472         ?>
473                 <li><p><?php printf( __( 'Add the following to your <code>web.config</code> file in <code>%s</code>, replacing other WordPress rules:' ), ABSPATH ); ?></p>
474                 <textarea class="code" readonly="readonly" cols="100" rows="20">
475                 <?php echo esc_textarea( $web_config_file ); ?>
476                 </textarea></li>
477                 </ol>
478
479         <?php else : // end iis7_supports_permalinks(). construct an htaccess file instead:
480
481                 $htaccess_file = 'RewriteEngine On
482 RewriteBase ' . $base . '
483 RewriteRule ^index\.php$ - [L]
484
485 # uploaded files
486 RewriteRule ^' . ( $subdomain_install ? '' : '([_0-9a-zA-Z-]+/)?' ) . 'files/(.+) wp-includes/ms-files.php?file=$' . ( $subdomain_install ? 1 : 2 ) . ' [L]' . "\n";
487
488                 if ( ! $subdomain_install )
489                         $htaccess_file .= "\n# add a trailing slash to /wp-admin\n" . 'RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]' . "\n";
490
491                 $htaccess_file .= "\n" . 'RewriteCond %{REQUEST_FILENAME} -f [OR]
492 RewriteCond %{REQUEST_FILENAME} -d
493 RewriteRule ^ - [L]';
494
495                 // @todo custom content dir.
496                 if ( ! $subdomain_install )
497                         $htaccess_file .= "\nRewriteRule  ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]\nRewriteRule  ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]";
498
499                 $htaccess_file .= "\nRewriteRule . index.php [L]";
500
501                 ?>
502                 <li><p><?php printf( __( 'Add the following to your <code>.htaccess</code> file in <code>%s</code>, replacing other WordPress rules:' ), ABSPATH ); ?></p>
503                 <textarea class="code" readonly="readonly" cols="100" rows="<?php echo $subdomain_install ? 11 : 16; ?>">
504 <?php echo esc_textarea( $htaccess_file ); ?></textarea></li>
505                 </ol>
506
507         <?php endif; // end IIS/Apache code branches.
508
509         if ( !is_multisite() ) { ?>
510                 <p><?php printf( __( 'Once you complete these steps, your network is enabled and configured. You will have to log in again.') ); ?> <a href="<?php echo esc_url( site_url( 'wp-login.php' ) ); ?>"><?php _e( 'Log In' ); ?></a></p>
511 <?php
512         }
513 }
514
515 if ( $_POST ) {
516
517         $base = trailingslashit( stripslashes( dirname( dirname( $_SERVER['SCRIPT_NAME'] ) ) ) );
518
519         check_admin_referer( 'install-network-1' );
520
521         require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
522         // create network tables
523         install_network();
524         $hostname = get_clean_basedomain();
525         $subdomain_install = !allow_subdomain_install() ? false : (bool) $_POST['subdomain_install'];
526         if ( ! network_domain_check() ) {
527                 $result = populate_network( 1, get_clean_basedomain(), sanitize_email( $_POST['email'] ), stripslashes( $_POST['sitename'] ), $base, $subdomain_install );
528                 if ( is_wp_error( $result ) ) {
529                         if ( 1 == count( $result->get_error_codes() ) && 'no_wildcard_dns' == $result->get_error_code() )
530                                 network_step2( $result );
531                         else
532                                 network_step1( $result );
533                 } else {
534                         network_step2();
535                 }
536         } else {
537                 network_step2();
538         }
539 } elseif ( is_multisite() || network_domain_check() ) {
540         network_step2();
541 } else {
542         network_step1();
543 }
544 ?>
545 </div>
546
547 <?php include( ABSPATH . 'wp-admin/admin-footer.php' ); ?>