nginx を使用した WordPress 内部リダイレクト

nginx を使用した WordPress 内部リダイレクト

パーマリンクが投稿名に設定されている WordPress サイトがあります。

Nginx の書き換えを使用して、内部リダイレクト (ブラウザの URL を変更せずに) を試みていますが、これまでのところ失敗しています。

これは機能しますが、URLが変わります

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

なぜこれが機能しないのか理解できません:

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

全体の構成

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

私はWordPressプラグインを書いていますが、ユーザーに次のようなURLを入力させたいのです。https://example.com/u/john71内部的にリダイレクトするhttps://example.com/p/?username=john71

両方あなたそしてpWordPressのページであり、pユーザー名を取得できるショートコードが含まれています。

ができたhttps://example.com/p/?username=john71、しかし、次のようになります:https://example.com/u/john71見た目が良くなりました。

書き換えルールやアプローチに関する助言があれば歓迎します。

答え1

URI は最終的に次のように書き換えられる/index.phpため、余分な内部書き換えは WordPress によって認識されることはありません。

WordPress は、REQUEST_URI パラメータで渡される元のリクエストを解析します (これは、fastcgi-php.confという別のファイルからインクルードされる可能性のある、 ファイル内で定義されますfastcgi_params)。

呼び出す前に REQUEST_URI と SCRIPT_FILENAME を直接設定することで、これを機能させることができる場合がありますfastcgi_pass- 例:

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

この では機能しないステートメントがfastcgi-php.conf含まれている可能性があるため、含めませんでした。try_fileslocation

関連情報