We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 23214
    • 36 Posts
    Hello,

    I'm not sure how many of you develop in multiple environments. I do most of my major web development tasks with XAMPP, and then apply/upload the changes to a live server.

    The problem is that I have to modify htaccess and config.inc.php specifically for each environment. It's not a serious issue, but I wonder if I could be lazy and create one configuration file for both environments.

    For example, in PHP I can do something like:
    if(mb_strpos($_SERVER['HTTP_HOST'], '192.168.254') === 0)
    {
    	// Localhost/XAMPP
    }
    else
    {
    	// Live
    }


    In htaccess, I'm aware that Apache 2.4 supports conditional logic using: <If></If>
    <Else></Else>

    Has anyone tried using this to create one htaccess which can be used in multiple environments?

    For example:
    <If "(%{HTTP_HOST} -strmatch '192.168.254.*')">
    	# Localhost/XAMPP
    	RewriteBase /XAMPP-Sites/projectX/public_html/
    	
    	# No need for a default domain
    </If>
    <Else>
    	# Live
    	RewriteBase /
    
    	# Ensure this is the default domain
    	RewriteCond %{HTTP_HOST} .
    	RewriteCond %{HTTP_HOST} !^www\.projectX\.com [NC]
    	RewriteRule (.*) http://www.projectX.com/$1 [R=301,L]
    </Else>


    The PHP example works without problems as far as I can tell. I can't get the htaccess to work though, and I'm not sure if it would create too much of an overhead for the sake of me being lazy.

    thanks
    Andrew
      • 22840
      • 1,572 Posts
      Can you just not upload the .htaccess file ?
        • 23214
        • 36 Posts
        Here is the full file.

        # No directory indexing please (for security)
        Options +FollowSymlinks
        Options -Indexes
        
        
        
        # MODX supports Friendly URLs via this .htaccess file. You must serve web
        # pages via Apache with mod_rewrite to use this functionality, and you must
        # change the file name from ht.access to .htaccess.
        #
        # Make sure RewriteBase points to the directory where you installed MODX.
        # E.g., "/modx" if your installation is in a "modx" subdirectory.
        #
        # You may choose to make your URLs non-case-sensitive by adding a NC directive
        # to your rule: RewriteRule ^(.*)$ index.php?q=$1 [L,QSA,NC]
        
        RewriteEngine On
        
        
        
        # Conditional Settings
        <If "(%{HTTP_HOST} -strmatch '192.168.254.*')">
        	# Localhost/XAMPP
        	#RewriteBase /XAMPP-Sites/projectX/public_html/
        
            # No need for a default domain
        </If>
        <Else>
            # Live
            #RewriteBase /
        
            # Ensure this is the default domain
            #RewriteCond %{HTTP_HOST} .
            #RewriteCond %{HTTP_HOST} !^www\.projectX\.com [NC]
            #RewriteRule (.*) http://www.projectX.com/$1 [R=301,L]
        </Else>
        
        
        
        # Hardcoded Settings instead of the <If> above
        # Live
        RewriteBase /
        
        # Ensure this is the default domain
        #RewriteCond %{HTTP_HOST} .
        #RewriteCond %{HTTP_HOST} !^www\.projectX\.com [NC]
        #RewriteRule (.*) http://www.projectX.com/$1 [R=301,L]
        
        
        
        # The Friendly URLs part
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
        
        
        
        # Make sure .htc files are served with the proper MIME type, which is critical
        # for XP SP2. Un-comment if your host allows htaccess MIME type overrides.
        
        #AddType text/x-component .htc
        
        
        
        # If your server is not already configured as such, the following directive
        # should be uncommented in order to set PHP's register_globals option to OFF.
        # This closes a major security hole that is abused by most XSS (cross-site
        # scripting) attacks. For more information: http://php.net/register_globals
        #
        # To verify that this option has been set to OFF, open the Manager and choose
        # Reports -> System Info and then click the phpinfo() link. Do a Find on Page
        # for "register_globals". The Local Value should be OFF. If the Master Value
        # is OFF then you do not need this directive here.
        #
        # IF REGISTER_GLOBALS DIRECTIVE CAUSES 500 INTERNAL SERVER ERRORS :
        #
        # Your server does not allow PHP directives to be set via .htaccess. In that
        # case you must make this change in your php.ini file instead. If you are
        # using a commercial web host, contact the administrators for assistance in
        # doing this. Not all servers allow local php.ini files, and they should
        # include all PHP configurations (not just this one), or you will effectively
        # reset everything to PHP defaults. Consult www.php.net for more detailed
        # information about setting PHP directives.
        
        #php_flag register_globals Off
        
        
        
        # For servers that support output compression, you should pick up a bit of
        # speed by un-commenting the following lines.
        
        #php_flag zlib.output_compression On
        #php_value zlib.output_compression_level 5
        
        
        
        # The following directives stop screen flicker in IE on CSS rollovers. If
        # needed, un-comment the following rules. When they're in place, you may have
        # to do a force-refresh in order to see changes in your designs.
        
        #ExpiresActive On
        #ExpiresByType image/gif A2592000
        #ExpiresByType image/jpeg A2592000
        #ExpiresByType image/png A2592000
        #BrowserMatch "MSIE" brokenvary=1
        #BrowserMatch "Mozilla/4.[0-9]{2}" brokenvary=1
        #BrowserMatch "Opera" !brokenvary
        #SetEnvIf brokenvary 1 force-no-vary
        
        
        # Adaptive-Images -----------------------------------------------------------------------------------
        
        # Add any directories you wish to omit from the Adaptive-Images process on a new line, as follows:
        # RewriteCond %{REQUEST_URI} !ignore-this-directory
        # RewriteCond %{REQUEST_URI} !and-ignore-this-directory-too
          
        RewriteCond %{REQUEST_URI} assets/images
        RewriteCond %{REQUEST_URI} assets/filemanager/images
           
        # Send any GIF, JPG, or PNG request that IS NOT stored inside one of the above directories
        # to adaptive-images.php so we can select appropriately sized versions
          
        RewriteRule \.(?:jpe?g|gif|png)$ assets/inc/adaptive-images.php
        
        # END Adaptive-Images -------------------------------------------------------------------------------
        
        
        
        # Request that browsers cache all ico and font files for 30 days
        # Thanks to:
        # http://www.tipsandtricks-hq.com/how-to-add-far-future-expires-headers-to-your-wordpress-site-1533
        # NB: 30*24*60*60 = 2592000
        <FilesMatch "\.(ico|eot|woff|ttf|svg)$">
        ExpiresActive On
        ExpiresDefault A2592000
        </FilesMatch>


        If I uncomment the RewriteBase within the <If> or <Else> I get a 404.

        I'm wondering if anyone else has used htaccess to support multiple environments with one file?
          • 3749
          • 24,544 Posts
          The IF and Else may not work on your local OS (especially if it's running Apache < 2.4). There's a workaround here: http://stackoverflow.com/questions/13992212/htaccess-if-statement.

          But let me re-ask PaulP's question, why not just skip that file in the transfer? Presumably you're already skipping all the config.core.php files and the config.inc.php file, why not just add .htaccess to the list of skipped files?

            Did I help you? Buy me a beer
            Get my Book: MODX:The Official Guide
            MODX info for everyone: http://bobsguides.com/modx.html
            My MODX Extras
            Bob's Guides is now hosted at A2 MODX Hosting
            • 23214
            • 36 Posts
            Ah, I misunderstood Paulp's reply...!

            Anyway, the point is I actually run the same MODX installation on XAMPP and on Live. What I'd like to be able to do is download all the files and DB from Live and run it in XAMPP, without having to change any config files.

            Running MODX in both environments isn't a problem, but I have to edit config.inc.php and .htaccess after I download from Live. There's no reason I can't just manually adjust the htaccess, I just thought it'd be nice if the <If><Else> conditionals worked.

            Maybe this is just a stupid idea though, but I figured altering config.inc.php would be easy enough, htaccess is causing a headache though.

            I'm running Apache 2.4.10 on Live and XAMPP 1.8.2 uses Apache 2.4.9.
              • 22840
              • 1,572 Posts
              I say again, why not just not download the .htaccess file, and config.inc.php or if your doing it as a .zip just keep a backup of each, those 2 file takes less than a second to move over to your local server from your hard drive and resolves all the issues ?

              really think your looking for a solution for a problem that doesn't exist, on any site if you transfer hosts theres going to be work .....
                • 3749
                • 24,544 Posts
                Along those lines, I have three files: .htaccess, .htaccess.local, and .htaccess.remote. It's a pretty simple matter to copy the appropriate one to .htaccess on either end.
                  Did I help you? Buy me a beer
                  Get my Book: MODX:The Official Guide
                  MODX info for everyone: http://bobsguides.com/modx.html
                  My MODX Extras
                  Bob's Guides is now hosted at A2 MODX Hosting