Страница 1 из 1

[nginx] Как применить rewrite правило для всех доменов?

Добавлено: 13 авг 2012, 20:31
didar_uranov
в контексте server{} для каждого домена в папке domains в файле настроек, который генерируется при запуске userdata\temp\config\nginx.conf, мне нужно чтобы прописывалось такое вот правило:
if (!-e $request_filename) {
			rewrite ^(.*)$ /index.php?route=$1 last;
		}
пробовал добавлять в файл userdata\config\Nginx-1.2.2_url.txt
но т.о сервер не запускается вообще и в логах nginx-xxx.log ничего нет

подскажите как это сделать

Добавлено: 13 авг 2012, 20:56
Максим
А что тут думать, нажмите Меню - Дополнительно - Конфигурация - Nginx, и вставляйте своё правило в шаблон хоста для корневого location. В чём проблема с этим?

Добавлено: 13 авг 2012, 21:30
didar_uranov
добавлял в server {} и в корневой location {}
# Первичный виртуальный хост "по умолчанию"
более полный конфиг:
пробовал в контексте server {}
server {
    listen %ip%:%httpport% default;
    location / {
      root   %sprogdir%/modules/system/html/openserver/default;
      index  index.html;
	  
	
    }
	  if (!-e $request_filename) {
		rewrite ^(.*)$ /index.php?route=$1 last;
	}
}
пробовал в контексте server { location / {} }
server {
    listen %ip%:%httpport% default;
    location / {
      root   %sprogdir%/modules/system/html/openserver/default;
      index  index.html;
	  
	  if (!-e $request_filename) {
		rewrite ^(.*)$ /index.php?route=$1 last;
	}
    }
	
}
open-server запустился, но rewrite правило не работает

Добавлено спустя 11 минут 43 секунды:
тот же rewrite только для апача:
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
единственно в каждом домене нужно создавать .htaccess файл с этими правилами
и на продакшне стоит nginx, так что нужно чтобы правило для Nginx работало для доменов

Добавлено: 13 авг 2012, 21:54
Максим
Зачем пишете "last;", уберите, окончание такое ";" должно быть. Тогда наверное и заработает ваше правило.

Добавлено: 14 авг 2012, 05:34
didar_uranov
"last;" тут не при чем. на продакшн сервере это реврайт правило работает как часы

Добавлено: 14 авг 2012, 05:51
Максим
Ну я не знаю что вам не нравится, правило то работает. Предположу что вам еще нужно чтобы и ненайденные .php тоже в index.php отправлясь, тогда помимо корневого location поместите правило в секцию fastcgi вместо записи try_files $uri =404;

У мены вышло так(последняя версия OS)
#---------------------------------------------#
# Внимание!                                   #
# При редактировании конфигурации хоста       #
# нельзя удалять или заменять системные       #
# переменные %...%, вы можете вносить только  #
# новые записи дополняющие конфигурацию.      #
#---------------------------------------------#

#---------------------------------------------#
# Начало блока конфигурации HTTP хоста        #
#---------------------------------------------#
server {
listen %ip%:%httpport%;
server_name %host% %aliases%;
location ~ /\. {deny all;}

location / {
    root   "%hostdir%";
    index  index.php index.html index.htm;
    if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php?route=$1 last;
   }
}

location ~ \.php$ {
    root           "%hostdir%";
    if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php?route=$1 last;
    }
    # if (!-e $document_root$document_uri){return 404;}    
    fastcgi_pass   backend;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  TMP    "%sprogdir%/userdata/temp";
    fastcgi_param  TMPDIR "%sprogdir%/userdata/temp";
    fastcgi_param  TEMP   "%sprogdir%/userdata/temp";
    fastcgi_connect_timeout 1s;
    fastcgi_next_upstream timeout;
    fastcgi_send_timeout 30s;
    fastcgi_read_timeout 30s;
    fastcgi_buffers 6 64k;
    fastcgi_ignore_client_abort off;
    #fastcgi_intercept_errors on;
    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 GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param SERVER_SOFTWARE    nginx;
    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 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        $host;
}

# Не удаляйте следующую строку конфигурации!
include "%sprogdir%/userdata/temp/config/%httpdriver%_url.conf";
}
#---------------------------------------------#
# Конец блока конфигурации HTTP хоста         #
#---------------------------------------------#




#---------------------------------------------#
# Начало блока конфигурации HTTPS хоста       #
#---------------------------------------------#
server {
listen %ip%:%httpsport%;
server_name %host% %aliases%;

ssl on;

location ~ /\. {deny all;}

location / {
    root   "%hostdir%";
    index  index.php index.html index.htm;
    if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php?route=$1 last;
    }
}

location ~ \.php$ {    
    root           "%hostdir%";
    if (!-e $request_filename) {
      rewrite ^(.*)$ /index.php?route=$1 last;
    }
    # if (!-e $document_root$document_uri){return 404;}    
    fastcgi_pass   backend;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  TMP    "%sprogdir%/userdata/temp";
    fastcgi_param  TMPDIR "%sprogdir%/userdata/temp";
    fastcgi_param  TEMP   "%sprogdir%/userdata/temp";
    fastcgi_connect_timeout 1s;
    fastcgi_next_upstream timeout;
    fastcgi_send_timeout 30s;
    fastcgi_read_timeout 30s;
    fastcgi_buffers 6 64k;
    fastcgi_ignore_client_abort off;
    #fastcgi_intercept_errors on;
    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 GATEWAY_INTERFACE  CGI/1.1;
    fastcgi_param SERVER_SOFTWARE    nginx;
    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 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        $host;
}

# Не удаляйте следующую строку конфигурации!
include "%sprogdir%/userdata/temp/config/%httpdriver%_url.conf";
}
#---------------------------------------------#
# Конец блока конфигурации HTTPS хоста        #
#---------------------------------------------#

Добавлено: 15 авг 2012, 06:16
didar_uranov
привет, Максим. не сработало.

Повторюсь. Мне нужно чтобы в конечном сгенерированном конфиге для nginx, который находится в userdata/temp/config/nginx.conf мое правило находилось в каждом виртуальном хосте в контексте server{}

еще лучше, если бы можно было выбирать какому домену прописывать правило, а какому нет

Добавлено: 15 авг 2012, 14:58
Максим
Что значит не сработало? Я вам дал абсолютно рабочие правила. В контексте server они не прописываются, такие правила прописываются в location. Ну а как создавать правила для отдельно взятого домена написано в справке.

Добавлено: 19 авг 2012, 07:50
didar_uranov
Максим, не работают.
Как вы уже догодались это правило для ЧПУрл.
т.е. http://test.com/page/2
преобразуется в http://test.com/?route=page/2

Правила можно писать в контекст server{} http://wiki.nginx.org/NginxHttpRewriteModule#if
И как я уже писал прекрасно работает на продакшн сервере.