Nginx 重写为自定义 PHP 框架

Nginx 重写为自定义 PHP 框架

我正在将自定义 mvc php 应用程序移至 ubuntu 和 nginx 上的生产环境,并且一直在努力解决该应用程序的重写结构问题。目标是采用面向控制器的 URL,如下所示:

    domain.com/index.php?controller=store&action=search&category=3

并将它们变成像这样的视觉上令人愉悦的 URL

    domain.com/store/search/category/3

与其他框架一样,该应用程序通过 index.php 文件运行所有请求,该文件会搜索适当的控制器来处理请求。为了处理这个问题,我添加了一个初始重写规则,如下所示:

    location / {
           try_files $uri $uri/ @rewrite;
        }

在重写模块中我有:

    location @rewrite {

        rewrite ^/(.*)$ /index.php?op=$1 last;   }

上面的代码让我开始通过更干净的 URL 访问我们的控制器,但我还没有接近解决此问题的更大策略。任何帮助都将不胜感激,我已经搜索了大部分网络,我遇到的资源似乎太模糊、太具体或过时了。

答案1

文档rewrite指示有一个可以直接解决您的问题的示例:

句法: rewrite regex replacement [flag];

但是如果这些指令放在location里面/download/last那么标志位应该替换为break,否则nginx会进行10次循环并返回500错误:

location /download/ {
    rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;
    rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;
    return  403;
}

我们需要修改/index.php?controller=store&action=search&category=3为字符串的正确形式,将其转换为从中replacement获取变量,并记得在里面使用。/store/search/category/3regexbreaklocation

  • 如果四个部分都是变量:

    rewrite ^/(.*)/(.*)/(.*)/(.*)$ /index.php?controller=$1&action=$2&$3=$4 break;
    
  • 如果category是 URL 的固定部分:

    rewrite ^/(.*)/(.*)/category/(.*)$ /index.php?controller=$1&action=$2&category=$3 break;
    

相关内容