Назад | Перейти на главную страницу

Правила перезаписи Nginx, fastcgi и WordPress - страницы 404 из-за REQUEST_URI?

Я пытаюсь преобразовать набор правил перезаписи, которые были созданы для Apache для размещения сайта WordPress, для использования с NginX (fastcgi, PHP).

Насколько я понимаю, в WordPress есть страница ("expo"), который затем использует код в теме для проверки параметра запроса ("p"). Затем он использует"p"для выполнения некоторых запросов к базе данных и отображения содержимого.

Таким образом, вы можете получить доступ к этой странице, позвонив /expo?p=name_of_expo.

Требование состоит в том, чтобы URL был структурирован следующим образом: /expo/name_of_expo

Я сократил его до самого простого правила перезаписи, которое я могу:

location ~ ^/expo/.+/?$ {
    rewrite ^/(.+)/(.+)/?$ /$1/?p=$2? last;
    try_files $uri $uri/ /index.php?$args;
}

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

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

Когда собираешься /expo?p=name_of_expo, отображается правильная страница. Однако когда вы собираетесь /expo/name_of_expo, запускается WordPress 404.

Журнал перезаписи от nginx предполагает, что записывается правильный URL:

2012/03/08 16:56:16 [notice] 15995#0: *7698 "^/(.+)/(.+)/?$" matches "/expo/name_of_expo", client: 192.168.60.116 [snip...]

2012/03/08 16:56:16 [notice] 15995#0: *7698 rewritten data: "/expo/", args: "p=name_of_expo", client: 192.168.60.116 [snip...]

Обязательная информация о версии программного обеспечения:

nginx version: nginx/1.0.13

spawn-fcgi v1.6.3 (ipv6) - spawns FastCGI processes
Build-Date: May 25 2010 12:33:48

PHP 5.2.10 (cli) (built: Nov 13 2009 11:44:05)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies

CentOS release 5.7 (Final)

Попробуй это

server {
  error_page   405   = @handler;
  error_page   404   = @handler;

  location / {
    if (-f $request_filename) {
      break;
    }

    if (!-e $request_filename) {
      rewrite . /index.php last;
    }
  }

  location @handler { 
    rewrite / /index.php;
  }

  location ~ \.php/ {
    rewrite ^(.*.php)/ $1 last;
  }

  location ~ \.php$ {
    if (!-e $request_filename) { rewrite / /index.php last; }

    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
  }

}

И в вашем fastcgi_params

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  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;