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

둘 다그리고WordPress 페이지이며,사용자 이름을 검색할 수 있는 단축 코드가 포함되어 있습니다.

나는 가질 수 있었다https://example.com/p/?username=john71, 하지만 다음과 같습니다.https://example.com/u/john71더 좋아 보인다.

재작성 규칙이나 접근 방식에 대한 도움을 환영합니다.

답변1

URI는 궁극적으로 다음과 같이 다시 작성됩니다 /index.php. 따라서 추가 내부 다시 작성은 WordPress에서 볼 수 없습니다.

fastcgi-php.confWordPress는 REQUEST_URI 매개변수( 파일에 정의되며 아마도 이라는 다른 파일의 요청을 포함할 수 있음 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

관련 정보