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

Nginx try_files вместо IF для выполнения условной логики

Я пытаюсь создать конфиги vhost Nginx, которые будут включать эквивалент правил перезаписи Apache htaccess для OpenCart. Вот оригинал:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

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

Вот что я сейчас использую в Nginx:

  location / {
    # This try_files directive is used to enable SEO-friendly URLs for OpenCart
    try_files $uri @opencart;
  }

  location @opencart {
    rewrite ^/(.+)$ /index.php?_route_=$1 last;
  }

Кажется, это работает, но я обеспокоен тем, что проверка этих определенных файлов отсутствует. Ничего из того, что мне удалось найти, не предлагает способ воспроизвести это условие без использования IF. Я также не уверен в причине этой части условий, то есть почему эти конкретные файлы имеют значение.

Мои вопросы:

  1. Есть ли способ сделать это, т.е. написать Nginx, эквивалентный условию, касающемуся этих типов файлов, без использования IF?

  2. Если первый блок местоположения моего примера Nginx будет изменен на try_files $ uri $ uri / @opencart; (добавляя $ uri /)

Спасибо за любую помощь.

Цель этого конкретного RewriteCond состоит в том, чтобы предотвратить запросы на несуществующий статические файлы передаются в OpenCart.

Вы можете сделать это с другим location. Например (с головы до ног, поэтому может потребоваться настройка):

location ~ \.(ico|gif|jpg|jpeg|png|js|css)$ {
    try_files $uri =404;
}