![Nginx 使用 try_files 代替 IF 来实现条件逻辑](https://linux22.com/image/659433/Nginx%20%E4%BD%BF%E7%94%A8%20try_files%20%E4%BB%A3%E6%9B%BF%20IF%20%E6%9D%A5%E5%AE%9E%E7%8E%B0%E6%9D%A1%E4%BB%B6%E9%80%BB%E8%BE%91.png)
我正在尝试创建 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 的情况下复制该条件。我也不确定这部分条件的原因,即为什么这些特定文件很重要。
我的问题是:
有没有办法做到这一点,即编写一个相当于有关这些文件类型的条件的 Nginx,而不使用 IF?
我的 Nginx 示例的第一个位置块是否应该更改为 尝试文件$uri $uri/@opencart;(添加 $uri/)
谢谢你的帮助。
答案1
这一特定目的RewriteCond
是防止不存在的静态文件被传递到 OpenCart。
您可以使用另一个来执行此操作location
。例如(这是我脑海中想到的,因此可能需要调整):
location ~ \.(ico|gif|jpg|jpeg|png|js|css)$ {
try_files $uri =404;
}