我有一个 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/