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.conf
archivo, 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.conf
porque puede contener una try_files
declaración que no funcionará en este archivo location
.