Nginx
nginx基於子字元串重寫url
我有一個 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/?$
將只匹配/pl
and/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; } }