Nginx

Nginx + PHP-FPM 執行腳本,但返回 404

  • November 25, 2012

我正在使用 Nginx + PHP-FPM 執行基於 Wordpress 的站點。我有一個 URL,它應該返回動態生成的 JSON 數據,以便與 DataTables jQuery 外掛一起使用。數據正確返回,但返回碼為 404。我認為這是 Nginx 配置問題,但我無法弄清楚原因。腳本“getTable.php”在目前使用 Apache 的網站的生產版本上正常工作。任何人都知道我怎樣才能讓它在 Nginx 上工作?

網址:http ://dev.iloveskydiving.org/wp-content/plugins/ils-workflow/lib/getTable.php

伺服器:CentOS 6 + Varnish(為開發禁用記憶體)+ Nginx + PHP-FPM + Wordpress + W3 總記憶體

Nginx 配置:

   server {

   # Server Parameters
   listen       127.0.0.1:8082;
   server_name  dev.iloveskydiving.org;
   root         /var/www/dev.iloveskydiving.org/html;
   access_log   /var/www/dev.iloveskydiving.org/logs/access.log main;
   error_log    /var/www/dev.iloveskydiving.org/logs/error.log error;
   index        index.php;

   # Rewrite minified CSS and JS files
   location ~* \.(css|js) {
       if (!-f $request_filename) {
           rewrite ^/wp-content/w3tc/min/(.+\.(css|js))$ /wp-content/w3tc/min/index.php?file=$1 last;
           expires         max;
       }
   }

   # Set a variable to work around the lack of nested conditionals
   set $cache_uri $request_uri;

   # Don't cache uris containing the following segments
   if ($request_uri ~* "(\/wp-admin\/|\/xmlrpc.php|\/wp-(app|cron|login|register|mail)\.php|wp-.*\.php|index\.php|wp\-comments\-popup\.php|wp\-links\-opml\.php|wp\-locations\.php)") {
       set $cache_uri "no cache";
   }

   # 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 $cache_uri 'no cache';
   }

   # Use cached or actual file if they exists, otherwise pass request to WordPress
   location / {
       try_files /wp-content/w3tc/pgcache/$cache_uri/_index.html $uri $uri/ /index.php?q=$uri&$args;
   }

   # Cache static files for as long as possible
   location ~* \.(xml|ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       try_files       $uri =404;
       expires         max;
       access_log      off;
   }

   # Deny access to hidden files
   location ~* /\.ht {
       deny            all;
       access_log      off;
       log_not_found   off;
   }

   location ~ \.php$ {

       try_files      $uri =404;
       fastcgi_split_path_info ^(.+\.php)(/.+)$;
       include        /etc/nginx/fastcgi_params;

       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
       fastcgi_param  PATH_INFO          $fastcgi_script_name;
       fastcgi_intercept_errors on;
       fastcgi_pass   unix:/var/lib/php-fpm/php-fpm.sock;  # port where FastCGI processes were spawned

   }

}

快速 CGI 參數:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

更新: 經過進一步探勘,看起來 Nginx 正在生成 404,而 PHP-FPM 正在正確執行腳本並返回 200。

更新: 以下是腳本的內容:

   <?php
/**
* Connect to Wordpres
*/
require(dirname(__FILE__) . '/../../../../wp-blog-header.php');

/**
* Define temporary array
*/
$aaData = array();
$aaData['aaData'] = array();

/**
* Execute Query
*/
$query = new WP_Query(
   array(
       'post_type'      => 'post',
       'posts_per_page' => '-1'
   )
);

foreach ($query->posts as $post) {

   array_push(
       $aaData['aaData'],
       array(
           $post->post_title
       )
   );

}

/**
* Echo JSON encoded array
*/
echo json_encode($aaData);

Panagiotis Papadomitsos 的問題促使我測試了幾個新的可能原因。我找到了以下文章: https ://cooltrainer.org/2010/06/20/fixing-false-404-headers-on-external-pages-include-wp-blog-header-php/

我在我的程式碼中更改了以下行:

regquire(dirname(__FILE__) . '/../../../../wp-blog-header.php');

到:

require(dirname(__FILE__) . '/../../../../wp-config.php');
$wp->init();
$wp->parse_request();
$wp->query_posts();
$wp->register_globals();
//$wp->send_headers();

似乎根本原因是 Wordpress 返回 404,而不是 Nginx,而不是 PHP-FPM。

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