我正在将自定义 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/3
regex
break
location
如果四个部分都是变量:
rewrite ^/(.*)/(.*)/(.*)/(.*)$ /index.php?controller=$1&action=$2&$3=$4 break;
如果
category
是 URL 的固定部分:rewrite ^/(.*)/(.*)/category/(.*)$ /index.php?controller=$1&action=$2&category=$3 break;