繁体   English   中英

mod_rewrite到nginx重写规则

[英]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中解析(请注意,我接受规则中的尾部斜杠,并将查询字符串附加到每个请求中):

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解析器,该解析器包含在这些重写规则之前。

如果我能解决解析问题而无需为每个数量的路由属性使用新规则,则可以加分。

我最终编写了以下规则:

文件处理程序

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM