Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm having problems with a wordpress site to enter the admin area.

If I enter with:

I get an infinite redirect loop but if I enter with:

it works

My client's server is a centos linux + nginx

the nginx.conf:

user  www www;
worker_processes 8;
error_log  logs/nginx_error.log  crit;
#pid        /usr/local/webserver/nginx/;

#Specifies the value for maximum file descriptors that can be opened by this process. 
worker_rlimit_nofile 51200;
  use epoll;
  worker_connections 51200;

  include       mime.types;
  default_type  application/octet-stream;
  #charset  gb2312;
  server_names_hash_bucket_size 128;
  client_header_buffer_size 32k;
  large_client_header_buffers 4 32k;
  client_max_body_size 8m;

  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 60;

  tcp_nodelay on;
  server_tokens off;

  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 64k;
  fastcgi_buffers 4 64k;
  fastcgi_busy_buffers_size 128k;
  fastcgi_temp_file_write_size 128k;

  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

  #limit_zone  crawler  $binary_remote_addr  10m;

    listen       80;
    index index.html index.htm index.php;
    root  /usr/local/nginx/htdocs/;

    #limit_conn   crawler  20;    

    location / {
        index  index.php;
        # If file not found, redirect to Zend handling, we can remove the (if) here and go directly rewrite
        if (!-f $request_filename){
        rewrite ^/(.+)$ /index.php?$1& last;
    location ~* ^.+\.(js|ico|gif|jpg|jpeg|pdf|png|css)$ {
      access_log   off;
      expires      7d;
    location ~ .*\.php?$ {
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;

#    location ~ .*\.(php|php5)?$
#    {      
#      #fastcgi_pass  unix:/tmp/php-cgi.sock;
#      fastcgi_pass;
#      fastcgi_index index.php;
#      include fcgi.conf;
#    }
#    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
#    {
#      expires      30d;
#    }
#    location ~ .*\.(js|css)?$
#    {
#      expires      7d;
#    }    

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  logs/access.log  access;

In chrome developer tools->network i can see a lot of 302 redirects, 25 aprox before show the error message.

Is it something bad configured in nginx? how can i solve it?

share|improve this question
up vote 1 down vote accepted

Here is the problem:

        if (!-f $request_filename){
        rewrite ^/(.+)$ /index.php?$1& last;

This is one of the most common nginx misconfigurations.

Replace these three lines with try_files:

try_files $uri $uri/ /index.php;

See also the WordPress wiki entry on nginx.

(BTW, your .htaccess does nothing, since you are not using Apache.)

share|improve this answer
i tried that before, reading that article with no luck – Oterox Aug 16 '13 at 15:44
Just reading is not enough, you have to actually do it :) – Michael Hampton Aug 16 '13 at 17:32
hehe "i tried that before" = i did it :) – Oterox Aug 16 '13 at 23:19
It doesn't appear that you actually did. If you had, then you would have a working system. Try it again, and document everything you do. – Michael Hampton Aug 16 '13 at 23:25
it works! I probably didn't save the file :) – Oterox Aug 19 '13 at 8:10

In the sites-enabled folder you will need to end the configuration for your site and add the multisite redirection rules. For Ubuntu 14.04 you will be able to find the path under /etc/nginx/sites-available

Add the following block in your server block and you should be able to avoid the infinite redirection loop.

#Rewrite multisite '.../wp-.*' and '.../*.php'.
if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
    rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
    rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

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