Nginx

nginx 根據部分 URL 重寫

  • February 21, 2019

我正在嘗試設置 nginx 重寫;我已成功設置以刪除副檔名:

https://example.com/accounts?id=user-123指向https://example.com/accounts.php?id=user-123僅使用 try_files:

location / { try_files $uri $uri/ $uri.html $uri.php?$args; }

我想在此之前設置第二次重寫;所有使用者 ID 都以 開頭user-,因此example.com/user-sdgas3應該重寫為example.com/accounts?id=user-sdgas3example.com/faq-abc8989as應該重寫為example.com/faqpage?id=faq-abc8989asexample.com/faq-abc8989as?view=true轉到example.com/faqpage?id=faq-abc8989as&view=true等等。

我嘗試的只是在每個 URL 擴展的開頭添加了這個的變體:

location ^/faq-(*)$ { try_files $faqpage?id=$1; }

沒有運氣。怎麼可能做到這一點?

您顯然不需要設置一連串的重寫(這看起來就像您正在嘗試的那樣)。這將是錯誤的做事方式:

/user-123 -> /accounts?id=user-123 -> /accounts.php?id=user-123

…因為顯然您可以/應該直接重寫到 PHP 處理程序文件:

/user-123 -> /accounts.php?id=user-123

您似乎沒有一個 PHP 入口點路由器(標準方法)。如果你這個,那就try_files足夠了。但是因為你有很多.php處理程序文件,你必須使用rewrite它們。

因此:

rewrite ^/user-(.*) /accounts.php?id=user-$1 last;
rewrite ^/faq-(.*) /faq.php?id=$1 last;

# This is only needed if /index.php can handle /this or /that route
location / {
   try_files $uri $uri /index.php$is_args$args;
} 

location \.php$ {
   ... the usual stuff for PHP-FPM
}

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