nginx.conf гуру, к вам вопрос.

Есть некий сайт sitename.com. В корне лежит index.php, который на деле подключает PHP-фреймворк (он самописный, но это не суть важно). В нем есть часть урлов прокинута и все отлично работает на внутреней системе роутов. Хотелось бы вынести /blog отдельно в виде сабдиректории и туда впилить WordPress. И тут возникает загвоздка c конфигурацией Nginx. Попробовал уже кучу вариантов из гугла и что-то ничего не завелось.

Сейчас nginx.conf выглядит так — http://pastebin.com/sf2rUPQk. В итоге sitename.com/blog/ дает 404 от Nginx, а sitename.com/blog прокидывает в WordPress, но получаем No input file specified.

Может кто сталкивался? Потому что я уже запарился — совсем голова не варит в эту тему.

28 Responses to nginx.

  1. Xxxno:

    pastebin не загрузился почему-то
    но вкратце
    location /blog {
    fastcgi_pass server:port;
    fastcgi_param SCRIPT_FILENAME /var/www/core$fastcgi_script_name;
    }

  2. Ffoblack:

    я знал, что зайдя в пост, увижу твой коммент!

  3. OkrSm:

    там точечка в урл парсером вставилась. http://pastebin.com/sf2rUPQk

  4. Xxxno:

    а зачем ты так нагородил-то?
    сделай отдельный локейшен на blog

  5. OkrSm:

    почему-то все найденные мной ссылки советовали городить 🙁
    сделал. в корне /blog/ получаю No input file specified. Если ручками дописать index.php, то скрипт обрабатывается, но не грузятся вложенные скрипты и графика.

  6. Xxxno:

    копай эррор лог.
    копай в сторону fastcgi_index, чтобы не писать руками index.php

  7. OkrSm:

    error.log пустой. Конфиг сейчас выглядит так — http://pastebin.com/Jhfhbg2r

  8. Xxxno:

    видимо, все-таки файлы php матчатся последним локейшеном.

  9. Naref:

    Адъ, ужас и мракобесие.
    Сейчас я схожу покурить, а потом расскажу вам всем, как надо.

  10. OkrSm:

    пробовал отключать — все равно результат тот же. и это странно.

  11. Naref:

    Так.

    server {

    root /path/to/docroot;
    index index.php

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

    location ~* ^.+.php$ {
    фастцги ;
    }

    }

  12. OkrSm:

    шаман! заработало 🙂

  13. OkrSm:

    спасибо! ларчик открывался просто — буду знать теперь

  14. Xxxno:

    некрасиво!

  15. Naref:

    Чой-та? 🙂

  16. Xxxno:

    Сысоев дрочит за if-ы в конструкциях.
    разруливать рекомендует локейшенами

  17. Naref:

    Ну, он дрочит совершенно справедливо, ибо if — очень дорого. Но! -e локэйшном никак не побороть, увы. Разве что через error_page — что получится как бы не дороже.

    Можно поиграться, конечно, в try_files — но не уверен, что это будет дешевле.

    Лично я позволяю себе if в трех случаях:

    1. Рерайты выше.
    2. if ($request_uri ~* ^/blabla/(.+)/docs/$) { set lang $1; }
    3. fastcgi_pass fcgi ; if ($remote_addr = ‘1.2.3.4’) { fastcgi_pass debug; }

  18. Ppoed:

    try_files будет работать как надо. if вообще лучше избегать по миллиону причин, начиная с того, что if это не то что все думают.

  19. Naref:

    try_files работает с директориями?

    Как работает if — я знаю, но маниакальное избегание его — сродни боязни зашквариться об goto (который, кстати, богато используется в nginx 🙂

  20. Ppoed:

    в случае с if (!–e $request_filename ) лучше использовать try_files, в случае с if ($request_uri ~* ^/blabla/(.+)/docs/$) лучше выделить отдельный локейшен, а вот случай с $remote_addr вполне легитимный.

  21. Naref:

    Блин, пойду тестить. Мне интересно поведение try_files — оно как -e или -f?

    Отдельные локейшны плодить — это ой. Конкретно этот пример выдернут из живого проекта, у которого есть переводы на примерно 40 языках — плодить 40 локэйшнов? По всем фронтэндам? 🙂
    Разворачивать query_string внутри пхпшечки?

    А вообще — есть прекрасный пример вырожденного случая. Однажды некий порносайт богато хакали, а разгрести килограммы кода было некому.
    Я плюнул, и нагенерил локейшнов из find /path/to/docroot -type f -name «*.php»
    Работало — на ура. Но — идиотизм.

  22. Naref:

    А, туплю — ты про регэксп в описании location. Да, это разумнее — только если тебе не нужно в контексте сервера переменную иметь.

  23. Ppoed:

    Зачем 40 локейшенов? «…location можно задать префиксной строкой или регулярным выражением.». Оно умеет captures. Делаешь один локейшен и там точно так-же set lang $1;

    Про try_files, не знаю. Мне кажется просто -f (если я правильно помню что делает -e)

  24. OkrSm:

    у меня почему-то вариант с try_files для отдельного локейшена /blog/ не завелся как надо. Если не ошибаюсь, то не отдавались внутренние файлы.

  25. 01pSpb:

    А на blog.site.com нельзя вынести? Сразу куча проблем уйдет со статикой, куками и прочей хуйней.

  26. OkrSm:

    я думал так сначала, но попросили именно /blog. Ну попросили и сделал — сейчас вроде все ок, проблем нет.

  27. 01pSpb:

    ну, им виднее. Вообще, у меня есть железное правило — никакого кода, кроме инициализиции фреймворка не должно быть в директории, доступной через веб. А вордпресс очень сильно ломает эти мои принципы, поэтому, при похожей ситуации я, мало того, что унёс ВП на отдельный поддомен, так еще и на отдельный сервак. Во избежании.

  28. OkrSm:

    вот тут ты прав, не поспоришь. подумаю над этим. спасибо

Добавить комментарий