skip to Main Content

I’m in the process of transitioning my single site WordPress installation into a multi-site. I’m trying to fix the broken CSS/JS from my main site.

I currently have two sites on my network:

My multi-site installation is inside of a subdirectory we will call "wordpress". So the file path looks like public_html/wordpress.

My goal is for neither site to have the "wordpress" subdirectory in the URL. Everything seems to be working except for broken CSS and JS on the primary site (the secondary site looks fine).

When inspecting the code, all of the CSS and JS calls point to http://www.example.com/wp-content/ but the files are not found there. The files will be found if I go to http://www.example.com/wordpress/wp-content in my browser. I want to hide the wordpress folder and still be able to retrieve the files.

I’m confused on how to setup the HTACCESS file. I already made some initial changes to it in order to get the multi-site within the subdirectory working. These were all following guides I found on StackOverflow and elsewhere online in regard to how to move your site into a multi-site with subdirectory and hiding the subdirectory. I haven’t found anything about addressing the broken CSS/JS issue.

I figured I need to make updates to one or more of 3 HTACCESS files.

1.) public_html/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wordpress/$1
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteRule ^(/)?$ /wordpress/index.php [L] 
</IfModule>

2.) public_html/wordpress/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /wordpress/
RewriteRule ^index.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*.php)$ $2 [L]
RewriteRule . index.php [L]
</IfModule>

3.) public_html/wordpress/wp-content/.htaccess
This file didn’t exist but I created it. My thinking was that files are being called without the wordpress subdirectory but they need to act like they have the subdirectory included in them. For example, currently http://www.example.com/wp-content/uploads/image.jpg is broken but http://www.example.com/wordpress/wp-content/uploads/image.jpg works. I want it to be the other way around or I want both paths to work.

<IfModule mod_rewrite.c>
RewriteEngine on
# ADD WORDPRESS IF URL DOES NOT HAVE IT
RewriteCond %{HTTP_HOST} ^(www.)?example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteRule ^(.*)$ /wordpress/$1
</IfModule>

I’ve tried adding different lines to the various HTACCESS files but none of them worked. I also not sure what line number I should insert a new rule. It’s possible that one of my new rules is correct but it is in the wrong place. Below is one that I really thought would work but didn’t.

RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]

3

Answers


  1. You shouldn’t have to set up several .htaccess files in your sub-directories.

    The only .htaccess file that need to be modified is the one located in the application root directory. In your case, it seems to be your public_html/.htaccess or your public_html/wordpress.

    Now by default WordPress generates an .htaccess file in that directory which looks something like the following:

    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    

    In order to rewrite your URLs, you need to add your RewriteRules before the WordPress code block.
    Since RewriteRules are processed from top to bottom, if the request is first rewritten to index.php by the WordPress block, then your rule will never be processed.

    Therefore your RewriteRule:

    RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]
    

    should be enough if it’s placed at the top of the root directory’s .htaccess, and remove the .htaccess file in the sub-directories

    Login or Signup to reply.
  2. First, you should remove all the .htaccess files and keep only the one in the root: public_html/.htaccess

    Second, your last rule isn’t working because is slightly wrong.

    You should change it from:

    RewriteRule ^/wp-content/(.*)$ /wordpress/wp-content/$1 [R=301,NC,L]
    

    To:

    RewriteRule ^wp-content/(.*)$ wordpress/wp-content/$1 [L,NC]
    

    Because you don’t need the starting / and you don’t need to 301 redirect. You want to keep your wordpress folder hidden and just map the requested URLs from wp-content/(.*) to wordpress/wp-content/$1

    Also, this rule must be the first in your .htaccess file to have priority over following default WordPress rules. Your final and only .htaccess from public_html/ should look like this:

    RewriteEngine On
    RewriteBase /
    RewriteRule ^wp-content/(.*)$ wordpress/wp-content/$1 [L,nc]
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    

    I hope it helps you.

    Login or Signup to reply.
  3. Most Multisite networks are installed in the root directory of your site. This means that if your server is using example.com, then this will be the URL for your base site on the network.

    If you’ve installed WordPress Multisite in a subdirectory, then you can’t use subdomains.

    If you already have a single site installation at example.com, and you add another WordPress installation in a subdirectory running Multisite, then its address will be example.com/wordpress.

    Any site you create on your new network will be at example.com/wordpress/my-new-site. Creating a subdirectory would be impossible here, as it would have to be at an address like example.com/wordpress/my-new-site.network Which just doesn’t work.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search