redirecionamento interno do wordpress usando nginx

redirecionamento interno do wordpress usando nginx

Eu tenho um site WordPress com links permanentes definidos como Post name.

Usando a reescrita do Nginx, estou tentando ter um redirecionamento interno (sem alteração na URL do navegador), mas até agora não estou conseguindo.

Isso funciona, mas o URL muda

location ~ ^/u/(.*) {
    rewrite ^/u/(.*) /p/?username=$1 redirect; 
}

Não entendo por que isso não funciona:

location ~ ^/u/(.*) {
    # this returns 404
    rewrite ^/u/(.*) /p/?username=$1 last;
}

Toda a configuração

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;
    }
}

Estou escrevendo um plugin para WordPress e quero que os usuários insiram URLs comohttps://example.com/u/john71e redirecionar internamente parahttps://example.com/p/?username=john71

Ambosvocêepsão páginas do WordPress epcontém um shortcode que me permite recuperar o nome de usuário.

eu poderia terhttps://example.com/p/?username=john71, mas algo como:https://example.com/u/john71parece melhor.

Qualquer ajuda sobre a regra ou abordagem de reescrita é bem-vinda.

Responder1

O URI é finalmente reescrito /index.php- portanto, a reescrita interna extra nunca é vista pelo WordPress.

O WordPress analisa a solicitação original, que é passada para ele no parâmetro REQUEST_URI (que será definido no seu fastcgi-php.confarquivo, que provavelmente o inclui de outro arquivo chamado fastcgi_params).

Você pode fazer isso funcionar definindo REQUEST_URI e SCRIPT_FILENAME diretamente antes de ligar fastcgi_pass- por exemplo:

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;
}

Não incluí fastcgi-php.conf, pois pode conter uma try_filesdeclaração que não funcionará neste arquivo location.

informação relacionada