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.conf
arquivo, 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_files
declaração que não funcionará neste arquivo location
.