WP_Rewrite::mod_rewrite_rules(): string

Retrieves mod_rewrite-formatted rewrite rules to write to .htaccess.

Description

Does not actually write to the .htaccess file, but creates the rules for the process that will.

Will add the non_wp_rules property rules to the .htaccess file before the WordPress rewrite rules one.

Return

string

More Information

returns a string (not an array) of all the rules. They are wrapped in an Apache <IfModule> block, to ensure mod_rewrite is enabled.

Source

public function mod_rewrite_rules() {
	if ( ! $this->using_permalinks() ) {
		return '';
	}

	$site_root = parse_url( site_url() );
	if ( isset( $site_root['path'] ) ) {
		$site_root = trailingslashit( $site_root['path'] );
	}

	$home_root = parse_url( home_url() );
	if ( isset( $home_root['path'] ) ) {
		$home_root = trailingslashit( $home_root['path'] );
	} else {
		$home_root = '/';
	}

	$rules  = "<IfModule mod_rewrite.c>\n";
	$rules .= "RewriteEngine On\n";
	$rules .= "RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]\n";
	$rules .= "RewriteBase $home_root\n";

	// Prevent -f checks on index.php.
	$rules .= "RewriteRule ^index\.php$ - [L]\n";

	// Add in the rules that don't redirect to WP's index.php (and thus shouldn't be handled by WP at all).
	foreach ( (array) $this->non_wp_rules as $match => $query ) {
		// Apache 1.3 does not support the reluctant (non-greedy) modifier.
		$match = str_replace( '.+?', '.+', $match );

		$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
	}

	if ( $this->use_verbose_rules ) {
		$this->matches = '';
		$rewrite       = $this->rewrite_rules();
		$num_rules     = count( $rewrite );
		$rules        .= "RewriteCond %{REQUEST_FILENAME} -f [OR]\n" .
			"RewriteCond %{REQUEST_FILENAME} -d\n" .
			"RewriteRule ^.*$ - [S=$num_rules]\n";

		foreach ( (array) $rewrite as $match => $query ) {
			// Apache 1.3 does not support the reluctant (non-greedy) modifier.
			$match = str_replace( '.+?', '.+', $match );

			if ( str_contains( $query, $this->index ) ) {
				$rules .= 'RewriteRule ^' . $match . ' ' . $home_root . $query . " [QSA,L]\n";
			} else {
				$rules .= 'RewriteRule ^' . $match . ' ' . $site_root . $query . " [QSA,L]\n";
			}
		}
	} else {
		$rules .= "RewriteCond %{REQUEST_FILENAME} !-f\n" .
			"RewriteCond %{REQUEST_FILENAME} !-d\n" .
			"RewriteRule . {$home_root}{$this->index} [L]\n";
	}

	$rules .= "</IfModule>\n";

	/**
	 * Filters the list of rewrite rules formatted for output to an .htaccess file.
	 *
	 * @since 1.5.0
	 *
	 * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess.
	 */
	$rules = apply_filters( 'mod_rewrite_rules', $rules );

	/**
	 * Filters the list of rewrite rules formatted for output to an .htaccess file.
	 *
	 * @since 1.5.0
	 * @deprecated 1.5.0 Use the 'mod_rewrite_rules' filter instead.
	 *
	 * @param string $rules mod_rewrite Rewrite rules formatted for .htaccess.
	 */
	return apply_filters_deprecated( 'rewrite_rules', array( $rules ), '1.5.0', 'mod_rewrite_rules' );
}

Hooks

apply_filters( ‘mod_rewrite_rules’, string $rules )

Filters the list of rewrite rules formatted for output to an .htaccess file.

apply_filters_deprecated( ‘rewrite_rules’, string $rules )

Filters the list of rewrite rules formatted for output to an .htaccess file.

Changelog

VersionDescription
1.5.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.