У меня есть сайт 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 и хочу, чтобы пользователи вводили такие URL-адреса, какhttps://example.com/u/john71] и внутреннее перенаправление наhttps://example.com/p/?username=john71
Оба u и p являются страницами WordPress, а p содержит шорткод, который позволяет мне получить имя пользователя.
Можно было быhttps://example.com/p/?username=john71, но что-то вроде:https://example.com/u/john71выглядит лучше.
Приветствуется любая помощь по правилу или подходу перезаписи.
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
.