我想将一些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处理它,但我仍然希望得到一个答案,我会慷慨任何人都会很好地回答这个问题!
答案 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 标记,不区分大小写的模式比较,它不应该是/*
之类的问题,模式中没有字符。