我有一个 WordPress 网站,其永久链接设置为帖子名称。
使用 Nginx 重写,我尝试进行内部重定向(浏览器 URL 不变),但到目前为止,还没有成功。
这有效,但 URL 会改变
location ~ ^/u/(.*) {
rewrite ^/u/(.*) /p/?username=$1 redirect;
}
我不明白为什么这不起作用:
location ~ ^/u/(.*) {
# this returns 404
rewrite ^/u/(.*) /p/?username=$1 last;
}
整个配置
server {
listen 80;
listen [::]:80;
server_name example.com;
root /srv/www/html;
error_log /var/log/nginx/error.log;
index index.php;
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ~ ^/u/(.*) {
rewrite ^/u/(.*) /p/?username=$1 last;
# try_files $uri /p/?username=$1;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
client_max_body_size 8M;
include fastcgi-php.conf;
# Mitigate https://httpoxy.org/ vulnerabilities
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors on;
fastcgi_pass 0.0.0.0:9000;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
expires max;
log_not_found off;
}
}
我正在编写一个 WordPress 插件,我希望用户输入如下 URLhttps://example.com/u/john71并内部重定向至https://example.com/p/?username=john71
两个都你和页是 WordPress 页面,并且页包含一个允许我检索用户名的短代码。
我本可以有https://example.com/p/?username=john71,而是类似这样的:https://example.com/u/john71看起来更好。
欢迎对重写规则或方法提供任何帮助。
答案1
URI 最终被重写为/index.php
- 因此 WordPress 永远不会看到额外的内部重写。
WordPress 解析原始请求,该请求通过 REQUEST_URI 参数传递给它(该参数将在您的fastcgi-php.conf
文件中定义,可能包含来自另一个名为 的文件中的内容fastcgi_params
)。
您可以通过在调用之前直接设置 REQUEST_URI 和 SCRIPT_FILENAME 来实现此功能fastcgi_pass
- 例如:
location ~ ^/u/(.*) {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param REQUEST_URI /p/?username=$1;
fastcgi_param HTTP_PROXY "";
fastcgi_intercept_errors on;
fastcgi_pass 0.0.0.0:9000;
}
我没有将其包括在内,fastcgi-php.conf
因为它可能包含try_files
在此不起作用的语句location
。