Внутреннее перенаправление wordpress с использованием nginx

У меня есть сайт 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выглядит лучше.

Приветствуется любая помощь по правилу или подходу перезаписи.

1
задан 17 September 2021 в 02:11
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.

0
ответ дан 17 September 2021 в 07:07

Теги

Похожие вопросы