Clear URL в Drupal через try_files!

Главные вкладки

Аватар пользователя V I R U S V I R U S 15 января 2010 в 1:30

Сегодня настраивал Drupal на чистом Nginx, не как прокси и сталкнулся с некоторыми проблемами относительно Clear URL. Везде было предложено 2 варианта,

Первый (рекомендуется автором Nginx):

server {
...
 
  location / {
    try_files $uri $uri/ [user=drupal]drupal[/user];
    index index.php index.html index.htm;
  }
 
  location ~ \.php$ {
    try_files $uri [user=drupal]drupal[/user];
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include  fastcgi_params;
  }
 
  location [user=drupal]drupal[/user] {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME      $document_root/index.php;
    fastcgi_param  QUERY_STRING         q=$uri&$args;
    fastcgi_param  REQUEST_METHOD       $request_method;
    fastcgi_param  CONTENT_TYPE         $content_type;
    fastcgi_param  CONTENT_LENGTH       $content_length;
    fastcgi_param  REDIRECT_STATUS      200;
    fastcgi_param  SCRIPT_NAME          /index.php;
    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;
  }

...
}

Второй (плохой вариант):

server {
...

  location / {
    index index.php index.html;

    if (!-e $request_filename) {
      rewrite ^/(.*)$ /index.php?q=$1 last;
    }

  }

...
}

Однако везде говорилось что через чистый try_files это работать не будет, однако попробовав, у меня заработало всё без каких либо проблем и ошибок, вот часть кода.
Третий вариант:

server {
...
       
  location / {
    index  index.html index.htm index.php;
    try_files $uri $uri/ /index.php?q=$uri&$args;
  }

...
}

Работает и imagecache встроенный в 7ю ветку, чистые урлы и прочее. Ошибок и багов пока не наблюдал!

Комментарии

Аватар пользователя V I R U S V I R U S 17 января 2010 в 15:42

Давай! Я сейчас 7ку успешно гоняю на этом варианте. Отлично работают все части ядра, админский Overlay, генерация превьюшек. Странно что этот вариант не документирован.

Аватар пользователя anon anon 1 февраля 2010 в 3:02

"V I R U S" wrote:
Странно что этот вариант не документирован.

он работоспособным стал совсем недавно. а учитывая большую любовь Игоря к документированию, ничего странного тут нет Wink
nginx такая штука, что документации обычно всегда мало и нужен "метод тыка" и бороздение рассылок, ИМХО...

Аватар пользователя roga_i_kopita roga_i_kopita 9 октября 2010 в 23:11

V I R U S wrote:

Первый (рекомендуется автором Nginx):

server {
...
 
  location / {
    try_files $uri $uri/ [user=drupal]drupal[/user];
    index index.php index.html index.htm;
  }
 
  location ~ \.php$ {
    try_files $uri [user=drupal]drupal[/user];
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include  fastcgi_params;
  }
 
  location [user=drupal]drupal[/user] {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME      $document_root/index.php;
    fastcgi_param  QUERY_STRING         q=$uri&$args;
    fastcgi_param  REQUEST_METHOD       $request_method;
    fastcgi_param  CONTENT_TYPE         $content_type;
    fastcgi_param  CONTENT_LENGTH       $content_length;
    fastcgi_param  REDIRECT_STATUS      200;
    fastcgi_param  SCRIPT_NAME          /index.php;
    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;
  }

...
}

Однако везде говорилось что через чистый try_files это работать не будет, однако попробовав, у меня заработало всё без каких либо проблем и ошибок, вот часть кода.
Третий вариант:

server {
...
       
  location / {
    index  index.html index.htm index.php;
    try_files $uri $uri/ /index.php?q=$uri&$args;
  }

...
}

На сколько грамотна была бы замена всего первого варианта (полностью) на следующую конструкцию?

location / {
   try_files $uri $uri/ /index.php?q=$uri&$args;
   index index.php index.html index.htm;
}
 
location ~ \.php$ {
   fastcgi_pass   unix:/tmp/php-fpm.sock;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
   include        fastcgi_params;
}

Не сам придумал, нашёл тут: http://vds-admin.ru/nginx/zamena-rewriterule-v-nginx-dlya-razlichnykh-cm...
Но смущает он своей простотой...