Nginx

使用 nginx 和 Wordpress 的 302 重定向循環

  • March 23, 2015

我已經在 Serverfault 中搜尋了幾個小時試圖解決這個問題,但我找不到解決方案。會發生什麼:

wget在我的網站中使用了 302 重定向循環,但沒有使用瀏覽器。在我的 nginx 配置中,我只有兩個301重定向,而不是302。我試圖禁用 wordpress 中的所有外掛,但沒有成功。

什麼可能導致問題?下面是我的 nginx 配置。一些例子wget

wget elbauldelprogramador.com
   --2014-10-30 13:10:24--  http://elbauldelprogramador.com/
   Resolving elbauldelprogramador.com (elbauldelprogramador.com)... 
   Connecting to elbauldelprogramador.com (elbauldelprogramador.com)||:80... connected.
   HTTP request sent, awaiting response... 302 Moved Temporarily
   Location: 404 [following]
   --2014-10-30 13:10:25--  http://elbauldelprogramador.com/404
   Reusing existing connection to elbauldelprogramador.com:80.
   HTTP request sent, awaiting response... 302 Moved Temporarily
   Location: 404 [following]
   --2014-10-30 13:10:25--  http://elbauldelprogramador.com/404
   Reusing existing connection to elbauldelprogramador.com:80.
   [...]
   HTTP request sent, awaiting response... 302 Moved Temporarily
   Location: 404 [following]
   20 redirections exceeded.

以及伺服器中的日誌:

S.IP - - [30/Oct/2014:13:11:22 +0100] "GET /404 HTTP/1.1" 302 154 "-" "Wget/1.15 (linux-gnu)"
S.IP - - [30/Oct/2014:13:11:22 +0100] "GET /404 HTTP/1.1" 302 154 "-" "Wget/1.15 (linux-gnu)"
S.IP - - [30/Oct/2014:13:11:22 +0100] "GET /404 HTTP/1.1" 302 154 "-" "Wget/1.15 (linux-gnu)"

Nginx 配置

server {
   #listen 127.0.0.1:81;
   listen 80;
   server_name www.example.com;
   return 301 $scheme://example.com$request_uri;
}

server {
#    listen 127.0.0.1:81;
   listen 80;
   server_name example.com 

   port_in_redirect off;
   server_tokens off;
   autoindex off;

   root /path;

   ## Page Speed Module ##
   include global/pagespeed.conf;

   ## Fastcgi cache start ##
   set $no_cache 0;

   # POST requests and urls with a query string should always go to PHP
   if ($request_method = POST) {
       set $no_cache 1;
   }
   if ($query_string != "") {
       set $no_cache 1;
   }

   # Don't cache uris containing the following segments
   if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
       set $no_cache 1;
   }

   # Don't use the cache for logged in users or recent commenters
   if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
       set $no_cache 1;
   }

   # Deliver 404 instead of 403 "Forbidden"
   error_page 403 = 404;

   include global/restrictions.conf;
   include global/caching.conf;


   # Additional rules go here.
   access_log log/access.log;
   error_log log/error.log warn;

   rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
   rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;

   location = /p/guia-de-desarrollo-android.html {
       rewrite  /p/guia-de-desarrollo-android.html http://example.com/curso-programacion-android/ permanent;
   }

   location = /p/bases-de-datos.html {
       rewrite  /p/bases-de-datos.html http://example.com/bases-de-datos/ permanent;
   }

   location = /feeds/posts/default {
       rewrite /feeds/posts/default http://example.com/feed permanent;
   }

   location = /p/guias-gratuitas.html {
       rewrite /p/guias-gratuitas.html http://example.com/manuales-gratuitos/ permanent;
   }

   # Only include one of the files below.
   include global/wordpress.conf;
   include global/security.conf;

}

包括全域/wordpress.conf;

#WordPress single blog rules.
# Designed to be included in any server {} block.

#A little something from the Search Overload blog entry
location = /search { 
   limit_req zone=wpsearch burst=3 nodelay;
   try_files $uri /index.php; 
}

location / {
   try_files $uri $uri/ /index.php;
}

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
   access_log off; log_not_found off; expires max;
}

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {

   # Zero-day exploit defense.
   # http://forum.nginx.org/read.php?2,88845,page=3
   # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
   # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
   try_files $uri =404;

   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

   include fastcgi_params;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_pass php;

   ##
   # Fastcgi cache
   ##
   fastcgi_cache_bypass $no_cache;
   fastcgi_no_cache $no_cache;
   fastcgi_cache microcache;
   fastcgi_cache_valid 60m;
}

提前致謝。

您的 nginx 配置有誤:

   error_page 403 = 404;

這會導致 nginx 嘗試重定向到名為“404”的文件,這正是正在發生的事情。

這應該寫成:

   error_page 403 =404;

或者更好的是,它根本不應該存在。發送一個明顯錯誤的錯誤程式碼是迷惑人們(比如你自己)的好方法。

引用自:https://serverfault.com/questions/640849