nginx 根据子字符串重写 url

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/ 然后它会很好地显示pl.php文件,但如果我添加用户ID或名称,然后它会将我重定向到Wordpress“找不到网页”页。

我究竟做错了什么?

答案1

首先,双斜杠是不需要的。正则表达式^/pl/?$只会匹配/pl/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

答案2

为什么是两个斜杠而不是一个?另外,您在非正则表达式位置使用了正则表达式语法,这就是它“有点”有效的原因。最后,您缺少虚拟路径的重写。

考虑到以上所有因素,我会尝试使用以下位置块:

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

答案3

这就是我解决问题的方法
rewrite ^/pl/(.*)$ /pl.php?user=$1 last;
,是的,只有这一条简单的规则,来自
https://www.nginx.com/blog/creating-nginx-rewrite-rules/

相关内容