【发布时间】:2012-07-28 17:54:01
【问题描述】:
我已将大部分 Apache HTTPd mod_rewrite 规则转换为 nginx 的 HttpRewrite 模块(在每个动态请求上通过 FastCGI 调用 PHP-FPM)。由硬位置定义的简单规则可以正常工作:
location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }
我仍然遇到正则表达式的问题,它在 mod_rewrite 中像这样解析(请注意,我接受规则中的斜杠,以及将查询字符串附加到每个请求):
mod_rewrite
# File handler
RewriteRule ^([a-z0-9-_,+=]+)\.([a-z]+)$ _core/frontend.php?type=$2&file=$1 [QSA,L]
# Page handler
RewriteRule ^([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)$ _core/frontend.php?route=$1/$2/$3 [QSA,L]
RewriteRule ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/$ _core/frontend.php?route=$1/$2/$3 [QSA,L]
我已经为该站点提出了以下服务器配置,但在解析请求后遇到了不匹配的规则(例如:GET /user/auth):
尝试 nginx 重写
location / {
# File handler
rewrite ^([a-z0-9-_,+=]+)\.([a-z]+)?(.*)$ /_core/frontend.php?type=$2&file=$1&$3 break;
# Page handler
rewrite ^([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1&$2 break;
rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2&$3 break;
rewrite ^([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)\/([a-z0-9-_,+=]+)(\/*)?(.*)$ /_core/frontend.php?route=$1/$2/$3&$4 break;
}
对于处理我的文件处理程序(只是 filename.ext)和我的页面处理程序(这是一个由正斜杠定义的最多 3 个属性的唯一路由请求),您有什么建议?强>
由于我还没有得到回复,我也不确定这是否会覆盖我用location ~ \.php {} 定义的 PHP 解析器,它包含在这些重写规则之前。
如果我能够解决解析问题而无需为每个路由属性数量使用新规则,则可以获得奖励积分。
【问题讨论】:
标签: regex mod-rewrite nginx rewrite