Question

The scenario is as follows:
A multisite install with three sites:

  • site1.com (admin)
  • site2.com
  • site3.com

Q: How to exclude a folder located in the root directory, which should also be associated with site3.com?

That is: exclude a particular directory that does not belong to WordPress so that it is accessible from: site3.com/folderToExclude/

Back in the day site3.com was a stand-alone site (now is part of the mentioned MU install), and this rule used to work:

RewriteCond %{REQUEST_URI} !^/(folderToExclude/.*)$

but that's no longer the case.

This is what the file looks like:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_URI} !^/(folderToExclude/.*)$

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) WordPress_04/$1 [L]
RewriteRule ^(.*\.php)$ WordPress_04/$1 [L]

RewriteRule . index.php [L]

</IfModule>
# END WordPress
Was it helpful?

Solution

This "exception" would only be required if you are requesting virtual URLs within /folderToExclude, as opposed to physical files. Any requests to physical directories and files are naturally excluded by the standard WordPress directives.

RewriteCond %{REQUEST_URI} !^/(folderToExclude/.*)$

# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]

This condition (RewriteCond directive) won't do anything where you've put it. RewriteCond directives don't do anything by themselves, they apply to the first RewriteRule directive that follows. In this case, the above rule is checking that the request URL-path matches /wp-admin and does not start /foldertoExclude/ - the condition is always successful (if A=B then A!=C), so is not doing anything.

However, as written, you couldn't place that condition on the later rule either since the logic is reversed. (Maybe you've used this in the past on a single-site WordPress install?)

Remove that RewriteCond directive entirely.

Rather than modifying the WordPress code block you should create an additional rule before the # BEGIN WordPress section, to exclude all requests that start /folderToExclude from being processed at all by the WordPress directives.

For example:

# Exclude specific directories
RewriteRule ^folderToExclude($|/) - [L]

# BEGIN WordPress
:

No need to repeat the RewriteEngine directive. No other RewriteCond directives are necessary.

An alternative is to create another .htaccess file in the /folderToExclude directive with a single RewriteEngine Off (or On) directive. This will then override the WordPress mod_rewrite directives in the parent .htaccess file.

Licensed under: CC-BY-SA with attribution
Not affiliated with wordpress.stackexchange
scroll top