Score:0

Redirect rules for multiple enviroments

ad flag

I have written a set of rules for 3 different environments on the same server. In a nutshell I would redirect the users to the Dev, Stage and Prod single sites. Also enforce https and www for the production environment.

// DEV environment rules

http://exampledev.prod.example.com  -> https://wwwdev.example.com
http://wwwdev.example.com -> https://wwwdev.example.com

// TEST environment rules

http://examplestg.prod.example.com  -> https://wwwtest.example.com
http://wwwtest.example.com -> https://wwwtest.example.com

// Prod rules

http://example.com -> https://www.example.com
https://example.com -> https://www.example.com
http://www.example.com -> https://www.example.com
http://exampleprod.prod.example.com -> https://www.example.com
https://exampleprod.prod.example.com -> https://www.example.com
http://wwwprod.example.com -> https://www.example.com
https://wwwprod.example.com -> https://www.example.com

Those are the rules that are not working at the moment:

# Various rewrite rules.
<IfModule mod_rewrite.c>
  RewriteEngine on

  # Set "protossl" to "s" if we were accessed via https://.  This is used later
  # if you enable "www." stripping or enforcement, in order to ensure that
  # you don't bounce between http and https.
  RewriteRule ^ - [E=protossl]
  RewriteCond %{HTTPS} on
  RewriteRule ^ - [E=protossl:s]

  # Make sure Authorization HTTP header is available to PHP
  # even when running as CGI or FastCGI.
  RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

  # Block access to "hidden" directories whose names begin with a period. This
  # includes directories used by version control systems such as Subversion or
  # Git to store control files. Files whose names begin with a period, as well
  # as the control files used by CVS, are protected by the FilesMatch directive
  # above.
  #
  # NOTE: This only works when mod_rewrite is loaded. Without mod_rewrite, it is
  # not possible to block access to entire directories from .htaccess because
  # <DirectoryMatch> is not allowed here.
  #
  # If you do not have mod_rewrite installed, you should remove these
  # directories from your webroot or otherwise protect them from being
  # downloaded.
  RewriteRule "/\.|^\.(?!well-known/)" - [F]

  # If your site can be accessed both with and without the 'www.' prefix, you
  # can use one of the following settings to redirect users to your preferred
  # URL, either WITH or WITHOUT the 'www.' prefix. Choose ONLY one option:
  #
  # To redirect all users to access the site WITH the 'www.' prefix,
  # (http://example.com/foo will be redirected to http://www.example.com/foo)
  # uncomment the following:
  # RewriteCond %{HTTP_HOST} .
  # RewriteCond %{HTTP_HOST} !^www\. [NC]
  # RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  #
  # To redirect all users to access the site WITHOUT the 'www.' prefix,
  # (http://www.example.com/foo will be redirected to http://example.com/foo)
  # uncomment the following:
  # RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
  # RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

  # Redirect internal domains to DEV website
  RewriteCond %{HTTP_HOST} ^exampledev\.prod\.example\.com$ [NC,OR]
  RewriteCond %{HTTP_HOST} ^wwwdev\.example\.com$ [NC]
  RewriteRule ^(.*)$ https://wwwdev.example.com/$1 [L,R=301]

  # Redirect internal domains to TEST website
  RewriteCond %{HTTP_HOST} ^examplestg\.prod\.example\.com$ [OR]
  RewriteCond %{HTTP_HOST} ^wwwtest\.example\.com$ [NC]
  RewriteRule ^(.*)$ https://wwwtest.example.com/$1 [L,R=301]

  # Redirect internal domains to Prod website
  RewriteCond %{HTTP_HOST} ^exampleprod\.prod\.example\.com$ [OR]
  RewriteCond %{HTTP_HOST} ^wwwprod\.example\.com $ [NC]
  RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]

  # ensure www.
  RewriteCond %{HTTP_HOST} !^www. [NC]
  RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301]

  # ensure https
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

  # Modify the RewriteBase if you are using Drupal in a subdirectory or in a
  # VirtualDocumentRoot and the rewrite rules are not working properly.
  # For example if your site is at http://example.com/drupal uncomment and
  # modify the following line:
  # RewriteBase /drupal
  #
  # If your site is running in a VirtualDocumentRoot at http://example.com/,
  # uncomment the following line:
  # RewriteBase /

  # Redirect common PHP files to their new locations.
  RewriteCond %{REQUEST_URI} ^(.*)?/(install\.php) [OR]
  RewriteCond %{REQUEST_URI} ^(.*)?/(rebuild\.php)
  RewriteCond %{REQUEST_URI} !core
  RewriteRule ^ %1/core/%2 [L,QSA,R=301]

  # Rewrite install.php during installation to see if mod_rewrite is working
  RewriteRule ^core/install\.php core/install.php?rewrite=ok [QSA,L]

  # Pass all requests not referring directly to files in the filesystem to
  # index.php.
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  RewriteRule ^ index.php [L]

  # For security reasons, deny access to other PHP files on public sites.
  # Note: The following URI conditions are not anchored at the start (^),
  # because Drupal may be located in a subdirectory. To further improve
  # security, you can replace '!/' with '!^/'.
  # Allow access to PHP files in /core (like authorize.php or install.php):
  RewriteCond %{REQUEST_URI} !/core/[^/]*\.php$
  # Allow access to test-specific PHP files:
  RewriteCond %{REQUEST_URI} !/core/modules/system/tests/https?\.php
  # Allow access to Statistics module's custom front controller.
  # Copy and adapt this rule to directly execute PHP files in contributed or
  # custom modules or to run another PHP application in the same directory.
  RewriteCond %{REQUEST_URI} !/core/modules/statistics/statistics\.php$
  # Deny access to any other PHP files that do not match the rules above.
  # Specifically, disallow autoload.php from being served directly.
  RewriteRule "^(.+/.*|autoload)\.php($|/)" - [F]
</IfModule>

I would appreciate any advice to make this rules work.

kz flag
What do you mean by "not working" exactly?
Manoxs avatar
ad flag
They are not doing the redirection, for example: http://exampledev.prod.example.com to https://wwwdev.example.com. I cleared all layers of cache
kz flag
There are numerous _spacing_ issues with the directives as posted which you would expect to result in a 500 Internal Server Error, since they are syntactically invalid. If you are not seeing a 500 error, are the spacing issues just typos in your question? What Apache version are you on?
Manoxs avatar
ad flag
Correct they are typos on the question since I have to rename to example.com, the original file don't have any extra spaces. This redirects are only for internal network since the external network is going thru Cloudflare page rules to enforce https, for the production domain.
kz flag
In that case you need to edit your question and correct the typos in the code and make sure it is a true representation of your actual code. (I see 4 erroneous spaces.) This is what the existing answer has focused on, so it is certainly misleading. If the _spaces_ are all corrected then this code should do "something" - are you saying _nothing_ happens? No error? The first two rules (DEV and TEST) would seem to be an obvious redirect loop - but I'm assuming that is not what you are seeing? What other rules do you have the `.htaccess` file? Where exactly are these rules placed in that file?
Manoxs avatar
ad flag
Thanks for the advice!, I have added the section where the rules are placed. I think the issue is that nothing happens, no obvious error.
kz flag
These rules are presumably in the root `.htaccess` file? And I'm assuming the other rules in that file appear to work as intended? Do these hostnames (you want to redirect from) actually resolve to this area of the filesystem?
Manoxs avatar
ad flag
Correct the rules are in the root. I'm trying to redirect the temporary domain according to this documentation https://acquia.my.site.com/s/article/360051147453-Redirect-From-Your-Temporary-Domain-to-Your-Own-Domain-or-Subdomain
Score:0
br flag

there is a space character in the second RewriteRule, which could cause issues in the redirection. This line:

RewriteRule ^(.*)$ https:// wwwtest.example.com/$1 [L,R=301]

should be updated to remove the space character after the "//":

RewriteRule ^(.*)$ https://wwwtest.example.com/$1 [L,R=301]

also, the condition in the first RewriteCond statement is missing a backslash before the dot in the domain name. It should be updated to:

RewriteCond %{HTTP_HOST} ^exampledev\.prod\.example\.com$ [NC,OR]

other than that, the rules appear to be correctly written, but make sure they are being applied in the correct order and in the appropriate context of the Apache configuration file.

Hope that helps

I sit in a Tesla and translated this thread with Ai:

mangohost

Post an answer

Most people don’t grasp that asking a lot of questions unlocks learning and improves interpersonal bonding. In Alison’s studies, for example, though people could accurately recall how many questions had been asked in their conversations, they didn’t intuit the link between questions and liking. Across four studies, in which participants were engaged in conversations themselves or read transcripts of others’ conversations, people tended not to realize that question asking would influence—or had influenced—the level of amity between the conversationalists.