Ich habe eine WordPress-Site mit auf den Beitragsnamen eingestellten Permalinks.
Mithilfe von Nginx Rewrite versuche ich, eine interne Weiterleitung einzurichten (ohne die Browser-URL zu ändern), aber bisher gelingt mir das nicht.
Dies funktioniert, aber die URL ändert sich
location ~ ^/u/(.*) {
rewrite ^/u/(.*) /p/?username=$1 redirect;
}
Ich verstehe nicht, warum das nicht funktioniert:
location ~ ^/u/(.*) {
# this returns 404
rewrite ^/u/(.*) /p/?username=$1 last;
}
Die gesamte Konfiguration
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;
}
}
Ich schreibe ein WordPress-Plugin und möchte, dass Benutzer URLs wie diese eingeben:https://example.com/u/john71und intern weiterleiten zuhttps://example.com/p/?username=john71
BeideSieUndPsind WordPress-Seiten undPenthält einen Kurzcode, mit dem ich den Benutzernamen abrufen kann.
ich könnte habenhttps://example.com/p/?username=john71, sondern so etwas wie:https://example.com/u/john71sieht besser aus.
Jede Hilfe bezüglich der Umschreiberegel oder des Ansatzes ist willkommen.
Antwort1
Die URI wird letztendlich umgeschrieben /index.php
, sodass WordPress die zusätzliche interne Umschreibung nie bemerkt.
WordPress analysiert die ursprüngliche Anfrage, die ihm im Parameter REQUEST_URI übergeben wird (der in Ihrer Datei definiert wird fastcgi-php.conf
, die ihn wahrscheinlich aus einer anderen Datei namens enthält fastcgi_params
).
Dies lässt sich möglicherweise erreichen, indem Sie REQUEST_URI und SCRIPT_FILENAME direkt vor dem Aufruf festlegen fastcgi_pass
, zum Beispiel:
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;
}
Ich habe es nicht eingefügt, fastcgi-php.conf
da es eine Anweisung enthalten könnte try_files
, die hier nicht funktioniert location
.