使用try_files时如何使用nginx执行apache QSA标志?

时间:2014-08-28 13:17:56

标签: apache .htaccess mod-rewrite nginx rewrite

我想将一些apache规则转换为nginx规则,并且是nginx的新手......

所以我搜索和搜索;但没找到我想做的事。这是我想在Nginx中转换的行:

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule (.*) index.php?page=$1 [NC,L,QSA]

以下是我的尝试:

location ~ ^/(?<page>[^\/]+)$ {
   try_files $uri /index.php?page=$page;
}
location ~ ^/(?<page>[^\/]+)?(?<qsa>[.*]+)$ {
   try_files $uri /index.php?page=$page&$qsa;
}

这不是在做这项工作。我做错了什么?

修改

太长了所以我用PHP处理它,但我仍然希望得到一个答案,我会慷慨任何人都会很好地回答这个问题!

1 个答案:

答案 0 :(得分:1)

Apache QSA 标志是查询字符串附加,在Nginx世界中查询字符串存储在$args中。

所以使用try_files这样的东西应该可以工作:

location ~ ^/(?<page>[^\/]+)$ {
   try_files $uri /index.php?page=$page&$args;
}

现在我不明白你在“正则表达式”所做的所有事情,(我是一个弱小的人,当我阅读正则表达式时,我总觉得六岁小孩试图读他们的第一个单词)。

使用像

这样的东西
location ~ ^/(.*) {
    try_files $uri/ $uri /index.php?page=$1&$args;
}

应该已经管理目录测试(目录访问的$uri/测试检查),真实文件直接访问($uri),然后回退到index.php,给定的url作为页面参数

您当前的第一个apache规则是:

RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]

检查直接目录访问-d),直接文件访问-f),符号链接-s)或使用-s直接将文件大小超过0访问,最后一个是-f的子集,所以我我不确定你是否需要它。

所以我们唯一需要处理的是符号链接直接访问。这由nginx

中的配置选项管理
disable_symlinks off;

对于 NC 标记,不区分大小写的模式比较,它不应该是/*之类的问题,模式中没有字符。