Reputation: 704
I have a wordpress installation in the root and another one in a subfolder within the root.
What would normally happen is that the url would look like:
https://example.com/quotes/us/some-url
but I wanted to remove 'quotes' from the url so it just ended up like:
https://example.com/us/some-url
Thanks to another stack overflow user, I was able to get that to work with the below htaccess code but I didn't realise that the images are now not showing and I get a 404 error for all of them. This is the root .htaccess file
RewriteRule ^[a-z]{2}/ quotes%{REQUEST_URI} [L]
# BEGIN rlrssslReallySimpleSSL rsssl_version[3.3.5]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
# END rlrssslReallySimpleSSL
# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<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
and the subfolder 'quotes' .htaccess looks like this
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*) /$1 [R=301,L]
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /quotes/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /quotes/index.php [L]
</IfModule>
# END WordPress
Upvotes: 2
Views: 687
Reputation: 45829
I get a 404 error to this path
https://example.com/wp-content/themes/theme_quotes/style.css?ver=1.0.0
. So, it is looking in the root installation where that theme doesn't exist as it only exists in the subdirectory installation
Currently, we only rewrite requests to the /quotes
subdirectory when the URL-path starts with a 2-letter language code, since that is the only thing that appears to differentiate the URLs between the two WordPress installs. However, that means that URLs to your static resources (as above) that do not have the language code prefix (and do not reference the /quotes
subdirectory directly) are not being rewritten and so fail with a 404.
This could perhaps be fixed in WordPress, by including /quotes
in the URL to your static resources. But that does expose the /quotes
subdirectory for anybody looking at your HTML source. We would also need to modify the redirect directive in the /quotes/.htaccess
file to prevent these requests being redirected back to root. EDIT: Actually, it looks like this is happening with your images already which already include the full ("correct") URL-path.
What we could do... in the root .htaccess
file, rewrite any request for a static resource (image, CSS or JS file) to the /quotes
subdirectory if it doesn't exist in the root. For example:
# Rewrite any URLs that contain a language code prefix to the subdirectory
RewriteRule ^[a-z]{2}/ quotes%{REQUEST_URI} [L]
# Rewrite any request for a static resource that does not exist (in the root)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule \.(css|js|png|jpg|webp|gif)$ quotes%{REQUEST_URI} [L]
# BEGIN WordPress
# : (Remainder of existing .htaccess file goes here)
This does mean that should you have two static resources with the same name (same base URL-path) in both installations then the one in the root installation will "win".
Note that this is a "blind" rewrite... if a particular static resource does not exist in either installation then you will always get the 404 in the /quotes
installation. But there's no way to really resolve that since there is an element of ambiguity in the URL-path structure.
AND, in the /quotes/.htaccess
file, prevent any direct requests for static resources being redirected back to the root. For example:
# Redirect any direct requests for "/quotes/<anything>" back to root
# Except for static resources
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|webp|gif)$
RewriteRule (.*) /$1 [R=301,L]
# BEGIN WordPress
# : (Remainder of existing .htaccess file goes here)
I'm assuming all your file extensions (to static resources) are lowercase.
You will need to clear your browser cache, since the image redirect back to root will likely have been cached by the browser (since this is a 301 - permanent - redirect).
Upvotes: 3