Назад | Перейти на главную страницу

Мультивьюверы в стиле Apache с Nginx

Я заинтересован в переходе с Apache / mod_php на Nginx для некоторых сайтов, не использующих CMS, которые я использую. Рассматриваемые сайты представляют собой либо полностью статические файлы HTML, либо простой PHP, но их объединяет то, что в настоящее время я использую Apache mod_negotiation для их обслуживания без расширений файлов. Меня не интересуют фактические переговоры по содержанию; Я использую это только для того, чтобы не использовать расширения файлов в своих URL-адресах.

Например, файл по адресу /info/contact.php доступен через URL всего /info/contact

Фактический файл - это .php файл в этом месте, но я не использую расширение в URL-адресах. Это дает мне немного более короткие и понятные URL-адреса, а также не раскрывает пользователю бессмысленные детали реализации. В Apache все, что для этого требуется, - это включить mod_negotiation и добавить + MultiViews в параметры сайта. Я так понимаю, что в Nginx я буду как-то переписывать, но, будучи новичком в Nginx, я не совсем уверен, как это сделать.

Эти сайты в настоящее время отлично работают при проксировании с Nginx на Apache, но я бы хотел попробовать запустить их только с Nginx / fastcgi. Они отлично работают таким образом, пока я использую расширения, поэтому аспект fastcgi работает отлично. Сейчас меня беспокоит только удаление этих расширений.

Важно помнить, что имя файла не всегда в URL-адресе, если речь идет о подкаталогах. То есть,

/foo/bar следует искать /foo/bar.php или /foo/bar/index.php

/foo/ следует искать /foo/index.php

Есть ли простой способ добиться этого с помощью Nginx или мне следует придерживаться проксирования на Apache?

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

server {
    server_name foo.com;
    root /your/root/path;
    index index.php;

    location /
        try_files $uri.php $uri/ /notfound.html;
    }

    # Your standard PHP location and everything else is still required here.
}

В качестве альтернативы вы можете использовать:

try_files $uri $uri/ index.php;

без / перед index.php он будет искать /foo/bar/index.php если бы не смог найти /foo/bar/somethingelse.php. (у большинства людей есть /index.php в качестве отступления, поскольку это обычно то, что работает с wordpress и подобными CMS).