WordPress + nginx infinite redirect loop

Oterox asked:

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/nginx.pid;

#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;
    server_name  www.beshan.com;
    index index.html index.htm index.php;
    root  /usr/local/nginx/htdocs/beshan.com/www/;

    #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?

My answer:

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.)

View the full question and any other answers on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.