Linux
Nginx 為自定義 PHP 框架重寫
我正在將一個自定義 mvc php 應用程序轉移到 ubuntu 和 nginx 上的生產環境中,並且一直在為應用程序的重寫結構而苦苦掙扎。目標是採用面向控制器的 url,如下所示:
domain.com/index.php?controller=store&action=search&category=3
並將它們變成這樣視覺上令人愉悅的網址
domain.com/store/search/category/3
與其他框架一樣,該應用程序通過 index.php 文件執行所有請求,該文件搜尋適當的控制器來處理請求。為了解決這個問題,我添加了一個初始重寫規則,如下所示:
location / { try_files $uri $uri/ @rewrite; }
在重寫模組中,我有:
location @rewrite { rewrite ^/(.*)$ /index.php?op=$1 last; }
上面的程式碼是讓我更接近通過更清晰的 url 訪問我們的控制器的開始,但我並沒有更接近一個更大的策略來處理這個問題。任何幫助將不勝感激,我已經搜尋了大部分網路,我遇到的資源似乎太模糊、太具體或過時了。
rewrite
指令的文件有一個直接幫助您解決問題的範例:句法:
rewrite regex replacement [flag];
但是如果將這些指令放在該
/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
為正確的形式,通過將其轉換為 a來replacement
獲取變數並記住使用inside 。/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;