4

I have a subdomain:

https://blog.example.com/

I forcibly redirects to subdirectory:

https://www.example.com/blog

By changing site URL and some RewriteRule on .htaccess.

Now the website and admin works fine except a small issue like when I tried to click save button on settings page (eg: Setting > Writing ) the site redirects to main domain:

https://www.example.com/wp-admin/options-writing.php?settings-updated=true

/blog is missing in the URL and end up in to main website 404 page.

My .htaccess file looks like :

    # BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTP:X-Forwarded-Host}i ^example\.com
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]

RewriteCond %{HTTP:X-Forwarded-Server}i !^www\.example\.com
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?[0-9]{4}/[0-9]{2}/(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]

RewriteCond %{HTTP:X-Forwarded-Server}i !^www\.example\.com
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]


RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

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

# END WordPress

When click save button, console have an error message:

/wp-admin/options-general.php?settings-updated=true:1 GET https://www.example.com/wp-admin/options-general.php?settings-updated=true 404 ()

Can anybody help to figure this out?

Updated working .htaccess (according to 1st answer) :

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
</IfModule>

My wordpress address and site address are:

WordPress Address (URL) =   /blog
Site Address (URL) = https://www.example.com/blog
2
  • What RewriteRule are you using in your .htaccess? Please edit your question with the rules you are using. Commented Sep 20, 2016 at 13:28
  • @EthanJinksO'Sullivan : Thanks for help. I updated the question with .htaccess content. Commented Sep 20, 2016 at 13:39

1 Answer 1

0

From looking at your .htaccess, it looks like your has too many rules overlapping each other. Do the following instead:

  1. Keep a backup of your current .htaccess if you need to go back to it
  2. Delete your .htaccess form the server, WordPress should automatically create a fresh one for you
  3. Open your new .htaccess file and add the following between the <IfModule mod_rewrite.c> tag:

.

RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]

Your .htaccess should then look 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]
# Custom rewrite
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
</IfModule>
# END WordPress
3
  • When I delete my current .htaacess and tried with yours, then I open website shows too many redirects. So I replace old .htaccess file. I should have to write rules for 1) non https -> https 2) subdomain -> sub directory . I noticed one thing that when I open console in wp-admin page I found an error : Uncaught SecurityError: Failed to execute 'replaceState' on 'History': A history state object with URL 'blog.example.com/wp-admin/index.php' cannot be created in a document with origin 'example.com' and URL 'example.com/blog/wp-admin/index.php'. Commented Sep 21, 2016 at 6:34
  • My updated .httaccess: # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /blog/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /blog/index.php [L] RewriteCond %{HTTP:X-Forwarded-Host}i ^example\.com RewriteCond %{HTTP_HOST} ^blog\.example\.com$ RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC] RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC] </IfModule> # END WordPress Commented Sep 21, 2016 at 6:39
  • When I dig more in to the console error, found the line causing error is: window.history.replaceState( null, null, document.getElementById( 'wp-admin-canonical' ).href + window.location.hash ); Commented Sep 21, 2016 at 7:59

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.