[英]mod_rewrite to nginx rewrite rules
我已将大多数Apache HTTPd mod_rewrite规则转换为nginx的HttpRewrite模块(该模块在每个动态请求上均通过FastCGI调用PHP-FPM)。 由硬位置定义的简单规则可以正常工作:
location = /favicon.ico { rewrite ^(.*)$ /_core/frontend.php?type=ico&file=include__favicon last; }
我仍然对正则表达式有麻烦,正则表达式像这样在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
)后遇到了不匹配的规则:
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解析器,该解析器包含在这些重写规则之前。
如果我能解决解析问题而无需为每个数量的路由属性使用新规则,则可以加分。
我最终编写了以下规则:
文件处理程序
location ~ ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ { include /web/_config/php.conf; rewrite ^/([a-zA-Z0-9-_]*)\.([a-zA-Z0-9]*)$ /_core/frontend.php?type=$2&file=$1 last; }
文件处理程序获取名称和扩展名,并将其写入type = {ext}&file = {name}中。
页面处理程序
location ~ ^/([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)$ /_core/frontend.php?route=$1 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2 last; }
location ~ ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ { include /web/_config/php.conf; rewrite ^/([a-z0-9-_]*)/?([a-z0-9-_]*)/?([a-z0-9-_]*)$ /_core/frontend.php?route=$1/$2/$3 last; }
页面处理程序(在这种情况下,最多处理3个“目录”)获取每个分隔符(/)之间的字符串,进行正则表达式验证并将其作为查询字符串写入。
此配置与我的原始配置之间的主要区别在于,每个条目都有自己的位置处理程序, last
规则是在第一个匹配项上对其进行处理,因此性能应稍好一些。
我还发现,nginx默认情况下会追加查询字符串,因此不需要regex,这是另一项性能改进。
请注意,/ /web/_config/php.conf
只是一种FastCGI直通配置,nginx随附的配置(通常是/etc/nginx/fastcgi.conf
)应该可以正常工作。 请注意,如果仅使用PHP,则无需在每个规则中都定义它,只需在其前面加上include。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.