Nginx try_files syntax

今天在一台很久不用的服务器上测试 Magento search result page,URL /catalogsearch/result/?q=searchword,发现它不工作,但其他页面正常。这个症状让我联想到以前碰到的类似问题,Magento 无法获得 query_string,所以含问号的 URL 都不能处理,页面重定向到 referring URL。应该是 server rewrite 规则没有写正确,我想。打开 nginx 的配置文件一看,果然,当中一条规则用的是很久以前的写法,后来在不同的服务器上几经改进,production server 都已经用上了新规则。

新规则的写法:


location @magento {
root $php_script_root;
index index.php;
if ($uri ~ ^/(media|js|skin)/) {
break;
}
if (!-e $request_filename) {
rewrite .* /index.php last;
}
}

而老规则的写法:


location @magento {
root $php_script_root;
index index.php;
if ($uri ~ ^/(media|js|skin)/) {
break;
}
try_files $uri $uri/ /index.php;
}

效果略有区别,我在 Difference of try_files to rewrite in Nginx 文章里有提及。不过,今天我还有一个新发现。

我倾向于使用简介语法,try_files 就比 rewrite 简洁得多,难道 try_files 就没有办法应付带问号的 URL 吗?非也,是我不知道 Nginx 原本可以这么奥妙——用 $args 变量!

因此,最新一条完美规则出炉了:


location @magento {
root $php_script_root;
index index.php;
if ($uri ~ ^/(media|js|skin)/) {
break;
}
try_files $uri $uri/ /index.php?$args;
}

Leave a comment

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