redirección interna de WordPress usando nginx

redirección interna de WordPress usando nginx

Tengo un sitio de WordPress con enlaces permanentes configurados en Nombre de publicación.

Usando la reescritura de Nginx, estoy intentando tener una redirección interna (sin cambios en la URL del navegador), pero hasta ahora estoy fallando.

Esto funciona, pero la URL cambia.

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

No entiendo por qué esto no funciona:

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

Toda la configuración

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

Estoy escribiendo un complemento de WordPress y quiero que los usuarios ingresen URL comohttps://ejemplo.com/u/john71y redirigir internamente ahttps://ejemplo.com/p/?username=john71

Ambostuypagson páginas de WordPress, ypagcontiene un código corto que me permite recuperar el nombre de usuario.

podría tenerhttps://ejemplo.com/p/?username=john71, pero algo como:https://ejemplo.com/u/john71Se ve mejor.

Cualquier ayuda sobre la regla o el enfoque de reescritura es bienvenida.

Respuesta1

En última instancia, el URI se reescribe /index.php, por lo que WordPress nunca ve la reescritura interna adicional.

WordPress analiza la solicitud original, que se le pasa en el parámetro REQUEST_URI (que se definirá en su fastcgi-php.confarchivo, que probablemente la incluya desde otro archivo llamado fastcgi_params).

Es posible que puedas hacer que esto funcione configurando REQUEST_URI y SCRIPT_FILENAME directamente antes de llamar fastcgi_pass, por ejemplo:

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

No lo he incluido fastcgi-php.confporque puede contener una try_filesdeclaración que no funcionará en este archivo location.

información relacionada