nginx redirect

Здравствуйте, все никак не могу нарыть информацию, вроде и не сложное условие, и делал раньше, но сейчас упорно не могу найти.
Мне надо написать условие для nginx чтоб при попадании на любой несуществующий файл шел редирект на index.php (с этим разобрались) но еще есть условие чтоб существующие файлы фильтровались по маске (вообще по расширению, но в идеале по регулярке, хотя на сколько я понял условия там и строятся на регулярках)
тоесть если файла нет — идем на индекс.пхп
а если файл есть но не соответствует условию /\.(jpg|gif|png)$/ то идем снова на индекс.пхп
22 февраля в 02:21
2
taliban 22,0

отсортировано по дате по оценке
ответы (4)

0
multifinger #
if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
rewrite ^(.*) /index.php last;
}


оно?
Странно что Вас минусовали =) Спасибо, это именно то что мне нужно. taliban, 22 февраля в 15:29
В nginx существует множество способов решить задачу и данный способ самый кривой. VBart, 22 февраля в 16:54
Кривой не кривой, а это единственный вариант _рабочий_, и удовлетворяющий всем требованиям, из всех мною перепробованных, остальные либо не работают, либо не выполняют все условия taliban, 22 февраля в 17:47
Игорь Сысоев очень не советует использовать реврайт если можно обойтись без него. В данном случае вам поможет try_files $uri index.php; WebSpider, 22 февраля в 19:55
Restarting nginx: [emerg]: «try_files» directive is not allowed here in… Как видите, предложеное решение @multifinger на данный момент я не могу ничем рабочим заменить. taliban, 22 февраля в 20:50
:to taliban
Может всё-таки попробуете почитать документацию?
VBart, 22 февраля в 21:15
Я читал документацию, я вчера весь день только и делал что читал документацию, я перепробовал кучу вариантов, в том числе все из текущих ответов. Ни один кроме этого не подошел, может я не там смотрю, тоже велика вероятность, но ни один вариант кроме этого с меткой «решение» не подходит на 100% под мое требование. Если Вы мне подскажите лучший вариант я буду благодарен, но я не могу тыкаться головой о стену постоянно перечитывая одно и то же, если не понимаю как его правильно применить. taliban, 22 февраля в 21:55
–1
mastini #
То что сразу в голову пришло. Не совсем понятно, что Вам надо, но есть от чего отталкиваться.
location / {
root /var/www/;
index index.php;

if (-f $request_filename) {
break;
}

if (-e $request_filename)
{
break;
}

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

}


или

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
if (-f $request_filename) {
break;
}

if (-e $request_filename)
{
break;
}

if (!-e $request_filename) {
rewrite ^(.+)$ /index.php last;
break;
}
}
+2
avalak #
Набросал базовый конфиг.
try_files быстрее и предпочтительнее чем rewrite.
Да, это правильный вариант. VBart, 22 февраля в 14:37
Он будет кидать на index.php при условии что запрос идет к index.html и он есть? taliban, 22 февраля в 15:26
Не будет. Попробуйте в качестве эксперимента почитать документацию, хотя бы по try_files.

+ у avalak по ссылки ошибка, должно быть:
location ~ \.php$ (не забываем экранировать точку)

и лучше так:
location ~* \.(?:js|css|png|jpe?g|gif|ico)$
VBart, 22 февраля в 16:50
Надо реабилитироваться. Перечитал условие на свежую голову. Этот конфиг должен подойти.

> тоесть если файла нет — идем на индекс.пхп
> а если файл есть но не соответствует условию /\.(jpg|gif|png)$/ то идем снова на индекс.пхп

Всегда идём на @php, кроме случаев когда файл в белом списке.
avalak, 23 февраля в 09:22
0
avalak #
Видимо этот момент я утром не заметил. Эта локация будет принудительно отправлять файлы по маске на index.php.
    location ~* \.(html|htm)$
    {
        try_files /index.php @php;
    }

+ error_page 404 @php;
для обработки ошибок.
Это вы на любой запрос оканчивающийся на .html отдадите содержимое /index.php, если он будет в запрошенной директории. VBart, 22 февраля в 16:52
s/в запрошенной директории/в корне/ VBart, 22 февраля в 16:54
Да, тут я облажался. + @taliban нужно было «всё кроме», а не всё по условию. avalak, 22 февраля в 16:58

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.