admin管理员组

文章数量:1301503

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

  • site1 (admin)
  • site2
  • site3

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

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

Back in the day site3 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

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

  • site1 (admin)
  • site2
  • site3

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

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

Back in the day site3 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
Share Improve this question edited Mar 16, 2021 at 10:46 MrWhite 3,8911 gold badge20 silver badges23 bronze badges asked Mar 14, 2021 at 7:23 NilsNils 437 bronze badges 2
  • "site3 was a stand-alone site" - what is it now? You shouldn't have to do anything to exclude a physical directory, as this should be excluded by default by the standard WP directives in .htaccess. So, I'm wondering why you even needed the directive as posted "back in the day"? (That should only have been an optimisation at best.) Please include the contents of your .htaccess file - maybe there is something else going on? – MrWhite Commented Mar 14, 2021 at 10:51
  • Thanks MrWhite. I was under the impression that a rule on the .htaccess file was a must in order to exclude a folder from a WordPress install. I've updated the post to include the current content of the file. – Nils Commented Mar 16, 2021 at 7:04
Add a comment  | 

1 Answer 1

Reset to default 1

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.

本文标签: redirectHow to exclude a directory from WordPress permalinks in a Multisite environment