Linux

Nginx 為自定義 PHP 框架重寫

  • June 11, 2017

我正在將一個自定義 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;

引用自:https://serverfault.com/questions/855085