Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Настройка rewrite в nginx - ЧПУ проконсультируйте.  (Прочитано 9789 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Прошу консультации о правильной конфигурации ЧПУ. Что то не удалось найти исчерпывающей информации по rewrite в nginx. Мой задача стоит заменить один гет параметр из вида ?id=* в /* . мое правило:

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

Проблема в том, что изходя из правила рерайт должен передавать как гет параметры все урл которые не являются папками, фйлами или ссылками. Но по факту от отдает в гет все. Где моя ошибка?

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #1 : 24 Августа 2012, 04:40:12 »
Скорее всего для нормальной работы этого условия необходимо определить корень директории (судя по другому сообщению). Ведь, чтобы определить настоящее имя файла из относительного пути запроса, нужно знать и корневую директорию. Думаю, что должно быть так:
location / {
    root /home/andrey/web/stroym32.ru/www/;
    if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?id=$1 break; }

Мой задача стоит заменить один гет параметр из вида ?id=* в /* .

rewrite ^/.*?id=(.*)$ /$1 break;
Возможно потребуется экранировать символ '?'.
« Последнее редактирование: 24 Августа 2012, 04:54:22 от unimix »

Оффлайн Humpty

  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
    • BarList.RU - рецепты коктейлей
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #2 : 25 Августа 2012, 16:10:49 »
Где моя ошибка?

Твоя ошибка в том, что надо использовать try_files, а это говнище, которое кочует из одной инструкции в другую и копипастится друг у друга разными "специалистами", забыть, как страшный сон. Прости за резкость, но уже достало.

Вот с официального сайта nginx:
http://sysoev.ru/nginx/docs/faq.html

Цитировать
Обычно практикуемая прямая трансляция правил:
location / {
    if (!-e $request_filename) {
        rewrite  ^(.*)  /index.php?q=$1  last;
    }
}

location = /index.php {
    fastcgi_pass  ...
    ... прочие fastcgi_param
}
достойна всяческого порицания.
« Последнее редактирование: 25 Августа 2012, 16:40:30 от Humpty »
Дельфин будет жить. А я умру.

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #3 : 27 Августа 2012, 11:46:35 »
Где моя ошибка?

Твоя ошибка в том, что надо использовать try_files, а это говнище, которое кочует из одной инструкции в другую и копипастится друг у друга разными "специалистами", забыть, как страшный сон. Прости за резкость, но уже достало.

Вот с официального сайта nginx:
http://sysoev.ru/nginx/docs/faq.html

Что то я непонял. Я использую связку апача и нжинс, пшп как бекенд. Вот конфиг нджинкса:

server {
listen 80;
server_name stroym32.ru www.stroym32.ru;
access_log /home/andrey/web/stroym32.ru/logs/nginx_access.log;
error_log /home/andrey/web/stroym32.ru/logs/nginx_error.log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
root /home/andrey/web/stroym32.ru/www/;
index index.html index.php;
access_log off;
expires 30d;
}

location ~ /\.ht {
deny all;
}


location / {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}

Как мне использовать тут try_files?

Должно быть как то так:

server {
listen 80;
server_name stroym32.ru www.stroym32.ru;
access_log /home/andrey/web/stroym32.ru/logs/nginx_access.log;
error_log /home/andrey/web/stroym32.ru/logs/nginx_error.log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
root /home/andrey/web/stroym32.ru/www/;
index index.html index.php;
access_log off;
expires 30d;
try_files $uri $uri/ @blablabla;
}

location ~ /\.ht {
deny all;
}


location @blablabla {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}

Но не понятно как передаются гет параметры и не работает =)
« Последнее редактирование: 27 Августа 2012, 12:14:59 от Aeooe »

Оффлайн Humpty

  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
    • BarList.RU - рецепты коктейлей
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #4 : 03 Сентября 2012, 20:42:39 »
Каша какая-то.
У тебя апач всё подряд отдаёт, в том числе и статику тоже, или всё же только php?
Логика, если апач только для php, должна быть какая-то такая:


server {
    listen 80;
    server_name stroym32.ru www.stroym32.ru;
    access_log /home/andrey/web/stroym32.ru/logs/nginx_access.log;
    error_log /home/andrey/web/stroym32.ru/logs/nginx_error.log;
    root /home/andrey/web/stroym32.ru/www/;
   
    location / {
        try_files $uri @clean_url;
    }

    location @clean_url {
    rewrite ^/(.*)$ /index.php?q=$1 last;
    }

    location ~ \.php$ {
         try_files $uri @clean_url;
         proxy_pass http://127.0.0.1:8081/;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-for $remote_addr;
         proxy_set_header Host $host;
         proxy_connect_timeout 60;
         proxy_send_timeout 90;
         proxy_read_timeout 90;
         proxy_redirect off;
         proxy_set_header Connection close;
         proxy_pass_header Content-Type;
         proxy_pass_header Content-Disposition;
         proxy_pass_header Content-Length;
  }
}



Дельфин будет жить. А я умру.

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #5 : 04 Сентября 2012, 11:36:14 »
Каша какая-то.
У тебя апач всё подряд отдаёт, в том числе и статику тоже, или всё же только php?
Должен отдавать только динамический контент. Делал по примеру
Полазил в справочниках и решил поправить конфиг. получилось вот что:

server {
listen 80;
server_name stroym32.ru www.stroym32.ru;
access_log /home/andrey/web/stroym32.ru/logs/nginx_access.log;
error_log /home/andrey/web/stroym32.ru/logs/nginx_error.log;
root /home/andrey/web/stroym32.ru/www/;

location / {
index index.html index.php;
access_log off;
expires 30d;
}


location ~ \.php$ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}

Появилась ошибка проксирования файлов:
Starting nginx: nginx: [emerg] "proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in /etc/nginx/sites-enabled/stroym32.ru:16
nginx: configuration file /etc/nginx/nginx.conf test failed


Пользователь решил продолжить мысль 04 Сентября 2012, 11:41:18:
PS Помойму первый конфиг так же работает. Судя из логики он отдает всю статику из регулярных локейшенов, и если условия регулярных локейшенов не удовлетворены - передает лекейшену /. Я ошибаюсь?

Пользователь решил продолжить мысль 04 Сентября 2012, 11:49:18:
Ну пока что получилось вот так:

server {
listen 80;
server_name stroym32.ru www.stroym32.ru;
access_log /home/andrey/web/stroym32.ru/logs/nginx_access.log;
error_log /home/andrey/web/stroym32.ru/logs/nginx_error.log;
root /home/andrey/web/stroym32.ru/www/;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
index index.html index.php;
access_log off;
expires 30d;
}

location ~ /\.ht {
deny all;
}

location @clean_url {
    rewrite ^/(.*)$ /index.php?id=$1 last;
    }

location / {
try_files $uri @clean_url;
proxy_pass http://127.0.0.1:8081/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}

Жду ваших замечаний.  :) Кстати проблема ранее заключалась в кривом прописании рут пути.
« Последнее редактирование: 04 Сентября 2012, 11:52:11 от Aeooe »

Оффлайн Humpty

  • Новичок
  • *
  • Сообщений: 41
    • Просмотр профиля
    • BarList.RU - рецепты коктейлей
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #6 : 06 Сентября 2012, 18:03:56 »
Должен отдавать только динамический контент. Делал по примеру
Полазил в справочниках и решил поправить конфиг. получилось вот что:

<skipped ...>

Появилась ошибка проксирования файлов:

Странно. А try_files выкинул из каких соображений?

Цитировать
PS Помойму первый конфиг так же работает. Судя из логики он отдает всю статику из регулярных локейшенов, и если условия регулярных локейшенов не удовлетворены - передает лекейшену /. Я ошибаюсь?

Работать-то работает, но с точки зрения формальной логики конфиг дурацкий.
Во-первых, скажем htm|html там очень не хватает, что я и имел в виду под "статикой".
Во-вторых, если например какое-нибудь iso кто-то решит выложить, опять править конфиг, или хрен с ним, пусть апач парится?
Дельфин будет жить. А я умру.

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #7 : 11 Сентября 2012, 10:20:27 »
Должен отдавать только динамический контент. Делал по примеру
Полазил в справочниках и решил поправить конфиг. получилось вот что:

<skipped ...>

Появилась ошибка проксирования файлов:

Странно. А try_files выкинул из каких соображений?


Этот конфиг я попробывал без рерайтов(для начала) и он выдал ошибку. Видимо ошибка заключается в этой строке "location ~ \.php$ {". Я ее неправильно записал?

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Подскажите инструкцию по составлению правил rewrite. Не могу найти как правильно составлять маски. Все символы ^/(.*)$ для меня не понятны :)

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Господа линуксоиды =) Подсобите. Не могу найти информацию на эту тему!  :)

Оффлайн Aeooe

  • Автор темы
  • Участник
  • *
  • Сообщений: 158
    • Просмотр профиля
    • Компания БИТ
Re: Настройка rewrite в nginx - ЧПУ проконсультируйте.
« Ответ #10 : 19 Апреля 2013, 12:41:56 »
Разобрался. В помощь правила составления регулярных выражений =)

 

Страница сгенерирована за 0.02 секунд. Запросов: 23.