Nginx

nginx基於子字元串重寫url

  • August 30, 2016

我有一個 php 腳本,它依賴於讀取 url 來執行必要的操作,所以我需要將使用者重定向到

example.com/pl/[User-id-or-name]example.com/pl.php/[User-id-or-name]

我是用一個簡單的 .htaccess 規則來做的

Options +FollowSymLinks +MultiViews
RewriteRule ^pl/?$ lp.php [NC]

並嘗試通過使用在 nginx 中做同樣的事情

location ^//pl//?$ {
   rewrite ^//pl//?$ /pl.php;
}

它有點工作,如果我去mydomain.com/pl/ Then 它會向我顯示pl.php文件就好了,但是如果我添加使用者 ID 或名稱,那麼它會將我重定向到 Wordpress *“找不到頁面”*頁面。

我究竟做錯了什麼?

首先,不需要雙斜杠。正則表達式^/pl/?$將只匹配/pland /pl/

您可以通過簡單地更正 中的表達式location並修復rewrite.

location ~ ^/pl(/.*)$ {
   rewrite ^/pl(/.*)$ /pl.php$1 break;
   return 403;
}

需要較少配置的更好選擇是將重寫放在server塊中。

server {
   [...]
   rewrite ^/pl(/.*)$ /pl.php$1 last;
   [...]
}

見:https ://nginx.org/en/docs/http/ngx_http_rewrite_module.html

為什麼是兩個斜線而不是一個?另外,您在非正則表達式位置使用正則表達式語法,這就是它“有點”起作用的原因。最後,您缺少對虛擬路徑的重寫。

考慮到以上所有因素,我會嘗試使用以下位置塊:

location / {
   if (!-e $request_filename) {
       rewrite ^/(.*)$ /pl.php;
   }
}

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