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