Страница 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
И как я уже писал прекрасно работает на продакшн сервере.