Nginx 使用 try_files 代替 IF 来实现条件逻辑

Nginx 使用 try_files 代替 IF 来实现条件逻辑

我正在尝试创建 Nginx vhost 配置,其中包含与 OpenCart 的 Apache htaccess 重写规则相同的内容。以下是原文:

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 示例的第一个位置块是否应该更改为 尝试文件$uri $uri/@opencart;(添加 $uri/)

谢谢你的帮助。

答案1

这一特定目的RewriteCond是防止不存在的静态文件被传递到 OpenCart。

您可以使用另一个来执行此操作location。例如(这是我脑海中想到的,因此可能需要调整):

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

相关内容