将 Nginx 重写从“if”转换为“try_files”

Posted

技术标签:

【中文标题】将 Nginx 重写从“if”转换为“try_files”【英文标题】:Convert Nginx rewrite from "if" to "try_files" 【发布时间】:2013-11-29 11:11:21 【问题描述】:

我有以下 nginx 重写规则,它非常适合安装在子文件夹中的 php 脚本:

location /subfolder/ 
  if (!-e $request_filename)
    rewrite ^/subfolder/(.*) /subfolder/index.php?do=/$1;
  

但是 Nginx wiki 说使用“if”是邪恶的 http://wiki.nginx.org/IfIsEvil 所以我尝试了以下

location /subfolder/ 
    try_files $uri $uri/ /subfolder/index.php?$args;

但它不能替换上面的那个,尽管它适用于 WordPress 和大多数 PHP 脚本。如果有办法将其翻译为使用“try_files”?

谢谢!

【问题讨论】:

【参考方案1】:

您只想在文件不存在时进行重写,将其用作try_files中回退的命名位置

location /subfolder 
    try_files $uri $uri/ @rewrite;


location @rewrite 
    rewrite ^/subfolder/(.*) /subfolder/index.php?do=/$1;

【讨论】:

这不起作用,Nginx 不会以以下错误消息开始:[emerg] unknown directive "$uri" in /etc/nginx/nginx.conf:2252 它指的是以下行:$uri $uri/ @rewrite; 添加 try_files 也没有帮助:try_files $uri $uri/ @rewrite;它会生成以下错误:/etc/nginx/nginx.conf:2254 中的未知指令“@rewrite” 你有什么 nginx 版本?是的,我忘了写 try_files 我的Nginx版本是1.0.10

以上是关于将 Nginx 重写从“if”转换为“try_files”的主要内容,如果未能解决你的问题,请参考以下文章

如何将此 apache 重写转换为 nginx?

需要帮助将 Apache2 重写规则转换为 nginx

需要帮助将 htaccess 规则转换为 nginx

我如何在 nginx Web 服务器的重写规则中将大写字母转换为小写字母?

[转] Nginx URL重写(rewrite)配置及信息详解

Nginx 中的多站点 WordPress 重写规则