How can i solve this error ERR_TOO_MANY_REDIRECTS ?

July 7, 2017 327 views
Apache DigitalOcean DigitalOcean Articles Ubuntu 16.04

Hi Guys,

I am facing an issue ERRTOOMANY_REDIRECTS which keep on coming after some time in chrome browser. I have followed the steps as suggested through this link (https://www.digitalocean.com/community/questions/migration-failed-badly-redirect-loop-error-server) and somewhat the issue was resolved as the same error now doesn't occur in another browser.

Kindly suggest what further changes i can do to make the website work flawless.

5 Answers

Hi @rohitpahuja

Are you using a CMS like WordPress? Can you post your Apache Vhost configuration - as well as any .htaccess.

  • Hi @hansen

    I am using Magento CMS. I added this code in 000-default.conf file and the issue is not occuring in firefox while it occurs in chrome browser.

            ServerName ninosdreams.com
            ServerAlias www.ninosdreams.com
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/html
            <Directory / >
            AllowOverride all
            </Directory>
    
    

    My .htaccess file is pasted below.

    ############################################
    ## uncomment these lines for CGI mode
    ## make sure to specify the correct cgi php binary file name
    ## it might be /cgi-bin/php-cgi
    
    #    Action php5-cgi /cgi-bin/php5-cgi
    #    AddHandler php5-cgi .php
    
    ############################################
    ## GoDaddy specific options
    
    #   Options -MultiViews
    
    ## you might also need to add this line to php.ini
    ##     cgi.fix_pathinfo = 1
    ## if it still doesn't work, rename php.ini to php5.ini
    
    ############################################
    ## this line is specific for 1and1 hosting
    
        #AddType x-mapp-php5 .php
        #AddHandler x-mapp-php5 .php
    
    ############################################
    ## default index file
    
        DirectoryIndex index.php
    
    <IfModule mod_php5.c>
    
    ############################################
    ## adjust memory limit
    
    #    php_value memory_limit 64M
        php_value memory_limit 256M
        php_value max_execution_time 18000
    
    ############################################
    ## disable magic quotes for php request vars
    
        php_flag magic_quotes_gpc off
    
    ############################################
    ## disable automatic session start
    ## before autoload was initialized
    
        php_flag session.auto_start off
    
    ############################################
    ## enable resulting html compression
    
        #php_flag zlib.output_compression on
    
    ###########################################
    # disable user agent verification to not break multiple image upload
    
        php_flag suhosin.session.cryptua off
    
    ###########################################
    # turn off compatibility with PHP4 when dealing with objects
    
        php_flag zend.ze1_compatibility_mode Off
    
    </IfModule>
    
    <IfModule mod_security.c>
    ###########################################
    # disable POST processing to not break multiple image upload
    
        SecFilterEngine Off
        SecFilterScanPOST Off
    </IfModule>
    
    <IfModule mod_deflate.c>
    
    ############################################
    ## enable apache served files compression
    ## http://developer.yahoo.com/performance/rules.html#gzip
    
        # Insert filter on all content
        ###SetOutputFilter DEFLATE
        # Insert filter on selected content types only
        #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript
    
        # Netscape 4.x has some problems...
        #BrowserMatch ^Mozilla/4 gzip-only-text/html
    
        # Netscape 4.06-4.08 have some more problems
        #BrowserMatch ^Mozilla/4\.0[678] no-gzip
    
        # MSIE masquerades as Netscape, but it is fine
        #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
        # Don't compress images
        #SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    
        # Make sure proxies don't deliver the wrong content
        #Header append Vary User-Agent env=!dont-vary
    
    </IfModule>
    
    <IfModule mod_ssl.c>
    
    ############################################
    ## make HTTPS env vars available for CGI mode
    
        SSLOptions StdEnvVars
    
    </IfModule>
    
    <IfModule mod_rewrite.c>
    
    ############################################
    ## enable rewrites
    
        Options +FollowSymLinks
        RewriteEngine on
    
    ############################################
    ## you can put here your magento root folder
    ## path relative to web root
    
        #RewriteBase /magento/
    
    ############################################
    ## uncomment next line to enable light API calls processing
    
    #    RewriteRule ^api/([a-z][0-9a-z_]+)/?$ api.php?type=$1 [QSA,L]
    
    ############################################
    ## rewrite API2 calls to api.php (by now it is REST only)
    
        RewriteRule ^api/rest api.php?type=rest [QSA,L]
    
    ############################################
    ## workaround for HTTP authorization
    ## in CGI environment
    
        RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
    ############################################
    ## TRACE and TRACK HTTP methods disabled to prevent XSS attacks
    
        RewriteCond %{REQUEST_METHOD} ^TRAC[EK]
        RewriteRule .* - [L,R=405]
    
    <IfModule mod_setenvif.c>
        <IfModule mod_headers.c>
    
            ############################################
            # X-Content-Type-Options: nosniff disable content-type sniffing on some browsers.
            Header set X-Content-Type-Options: nosniff
    
            ############################################
            # This header forces to enables the Cross-site scripting (XSS) filter in browsers (if disabled)
            BrowserMatch \bMSIE\s8 ie8
            Header set X-XSS-Protection: "1; mode=block" env=!ie8
    
        </IfModule>
    </IfModule>
    
    ############################################
    ## redirect for mobile user agents
    
        #RewriteCond %{REQUEST_URI} !^/mobiledirectoryhere/.*$
        #RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
        #RewriteRule ^(.*)$ /mobiledirectoryhere/ [L,R=302]
    
    ############################################
    ## always send 404 on missing files in these folders
    
        RewriteCond %{REQUEST_URI} !^/(media|skin|js)/
    
    ############################################
    ## never rewrite for existing files, directories and links
    
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-l
    
    ############################################
    ## rewrite everything else to index.php
    
        RewriteRule .* index.php [L]
    
    </IfModule>
    
    
    ############################################
    ## Prevent character encoding issues from server overrides
    ## If you still have problems, use the second line instead
    
        AddDefaultCharset Off
        #AddDefaultCharset UTF-8
    
    <IfModule mod_expires.c>
    
    ############################################
    ## Add default Expires header
    ## http://developer.yahoo.com/performance/rules.html#expires
    
        ExpiresDefault "access plus 1 year"
    
    </IfModule>
    
    ############################################
    ## By default allow all access
    
        Order allow,deny
        Allow from all
    
    ###########################################
    ## Deny access to release notes to prevent disclosure of the installed Magento version
    
        <Files RELEASE_NOTES.txt>
            order allow,deny
            deny from all
        </Files>
    
    ############################################
    ## If running in cluster environment, uncomment this
    ## http://developer.yahoo.com/performance/rules.html#etags
    
        #FileETag none
    
    ###########################################
    ## Deny access to cron.php
        <Files cron.php>
    
    ############################################
    ## uncomment next lines to enable cron access with base HTTP authorization
    ## http://httpd.apache.org/docs/2.2/howto/auth.html
    ##
    ## Warning: .htpasswd file should be placed somewhere not accessible from the web.
    ## This is so that folks cannot download the password file.
    ## For example, if your documents are served out of /usr/local/apache/htdocs
    ## you might want to put the password file(s) in /usr/local/apache/.
    
            #AuthName "Cron auth"
            #AuthUserFile ../.htpasswd
            #AuthType basic
            #Require valid-user
    
    ############################################
    
            Order allow,deny
            Deny from all
    
        </Files>
    
    # Detect the Load-Balancer-Header and set the header magento expects
    SetEnvIf X-Forwarded-Proto https HTTPS=on   
    

@rohitpahuja If you get an 500 error, then it should be in your error log. Check that you haven't modified the default path in you Vhost, otherwise it's normally located in /var/log/apache2/error.log.

  • @hansen /var/log/apache2/error.log is empty

    • @rohitpahuja Check you Vhost configuration and make sure that's the actual error_log path.

      • @hansen : the file errorlog is present in the path, but its empty.. The path for log mentioned in 000-default.conf is ${APACHELOG_DIR}/error.log

    • @rohitpahuja
      Currently your site is returning 503 errors. If they are not logged in that file, then there is something wrong with your Apache configuration.

      • yes i added 'RequestHeader unset HTTPS' in .htaccess file which is returning this error. restarted apache and log has started generating,

        [Fri Jul 07 21:28:19.205158 2017] [core:alert] [pid 20496] [client 172.31.28.142:35160] /var/www/html/.htaccess: Invalid command 'RequestHeader', perhaps misspelled or defined by a module not included in the server configuration
        
        
        • enabled RequestHeader, but still the same issue. I guess adding 'RequestHeader unset HTTPS' in .htaccess file is not the solution.

      • @hansen enabled RequestHeader, but still the same issue. I guess adding 'RequestHeader unset HTTPS' in .htaccess file is not the solution.

@rohitpahuja Does it only happen to you or everyone using Chrome?

  • @rohitpahuja Can you post your Apache Vhost configuration.

  • @rohitpahuja Are you running multiple servers?

    • @hansen No, i am using single server on AWS.

      <VirtualHost *:80>
              # The ServerName directive sets the request scheme, hostname and port that
              # the server uses to identify itself. This is used when creating
              # redirection URLs. In the context of virtual hosts, the ServerName
              # specifies what hostname must appear in the request's Host: header to
              # match this virtual host. For the default virtual host (this file) this
              # value is not decisive as it is used as a last resort host regardless.
              # However, you must set it for any further virtual host explicitly.
              #ServerName www.example.com
      
              ServerName ninosdreams.com
              ServerAlias www.ninosdreams.com
              ServerAdmin webmaster@localhost
              DocumentRoot /var/www/html
              <Directory / >
              AllowOverride all
              </Directory>
      
              # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
              # error, crit, alert, emerg.
              # It is also possible to configure the loglevel for particular
              # modules, e.g.
              #LogLevel info ssl:warn
      
              ErrorLog ${APACHE_LOG_DIR}/error.log
              CustomLog ${APACHE_LOG_DIR}/access.log combined
      
              # For most configuration files from conf-available/, which are
              # enabled or disabled at a global level, it is possible to
              # include a line for only one particular virtual host. For example the
              # following line enables the CGI configuration for this host only
              # after it has been globally disabled with "a2disconf".
              #Include conf-available/serve-cgi-bin.conf
      </VirtualHost>
      
      # vim: syntax=apache ts=4 sw=4 sts=4 sr noet
      ~
      
      
  • @hansen I believe everyone, as many people have complained this to me.

@rohitpahuja

Change the *:80 configuration to this:

<VirtualHost *:80>
        ServerName ninosdreams.com
        ServerAlias www.ninosdreams.com
        Redirect permanent / https://ninosdreams.com/
</VirtualHost>

And post your configuration for HTTPS.

The reason why I'm asking is because I'm getting a return from two IPs, but I don't know how Amazon hosting works, so you might need to ask them.

ninosdreams.com.    59  IN  A   13.126.120.235
ninosdreams.com.    59  IN  A   35.154.90.209
  • May be you getting a return from two IPs is because of Load Balancer which i am using in AWS.
    I have already tried adding 'Redirect permanent / https://ninosdreams.com/' but didn't resolved the issue.

    • @rohitpahuja
      The redirect is just to make sure everything is being redirected to HTTPS.
      But you haven't posted your HTTPS configuration. And you might need to contact AWS, since I have no idea how their load balancer works.

        • @rohitpahuja
          But you still haven't posted the https configuration. And if you're adding that to the <VirtualHost *:80> and it fixes the issue, then there's something wrong in your Magento configuration.

      • I too think now the issue can be due to load balancer redirect. Will study about it and will get back to you once i find the solution.
        Thank you so much @hansen for the help. Really appreciate :) :) :)

        • @rohitpahuja
          Do not have a redirect from HTTPS (443) to HTTP (80) - you want everyone to use HTTPS.
          Again, I have no idea how AWS load balancer work, but I would simply remove any redirecting the load balancer is doing and just have your server control that.

          • Yeah you are right at this , but i am confused now why the issue is only in chrome.. If redirection is the problem then it should have been in firefox too. It's resolved in firefox by adding the code in virtual host.

@rohitpahuja
Firefox has a different way it protects against loops, so instead of showing an error, it only does a single loop (similar to a page reload) - I actually think it generates a warning in the developer console.
It's different browsers, so they have different internals and how they handle things.

Have another answer? Share your knowledge.