Difference of try_files to rewrite in Nginx

try_files 是 Nginx 自0.6.36 新增的 directive。通常对 try_files 的理解是——它是
if (!-e $request_filename) {
rewrite .* /index.php;
}

的更简洁的表达。但我发现它们之间还是略有区别,主要表现在两点:

  1. 如使用 rewrite,Nginx 要求 document_root 下必须有一个 index 文件,即使我把另一个目录别名整个 document_root,但因为 Nginx 先校验 document_root 下是否有一个 index 文件,所以得放置一个空 index 文件。try_files 则没有 index 文件校验,直接去第二、第三… document_root 找对应的文件。
  2. 如使用 try_files $uri $uri/ /index.php,index.php 不能取得 get 变量,例如在 Magento 下,对 http://mydomain/catalogname?mode=list 的访问不能起效,Nginx 交付的页面是 http://mydomain/catalogname。这时必须使用 rewrite。这或许是 try_files 的一个 bug。

Leave a comment

Your email address will not be published. Required fields are marked *