NGINX 재작성 규칙이 작동하지 않습니다.

NGINX 재작성 규칙이 작동하지 않습니다.

규칙을 다시 작성하기 위해 NGINX를 사용하고 있지만, 무엇을 하든 작동하지 않습니다.

현재 링크:

  • /tutorials/index.php?article=2

내가 원하는 방식

  • /tutorials/2

내 - 현재 - NGINX 재작성 구성/규칙:

location / {
    try_files $uri $uri/ =404 /index.php?$args;
    rewrite ^/tutorials/([0-9]+)$ /tutorials/index.php?article=$1 last;
}

내가 여기서 뭘 잘못하고 있는 걸까?


내 NGINX 구성 파일:

server {

        # Hide php extension: ".php"
        if (!-e $request_filename) {
                rewrite ^(.*)$ /$1.php;
        }

        # Redirect to HTTPS
        if ($scheme = http) {  return 301 https://$host$request_uri; }

        # Access rule(s)
        location / {
                try_files $uri $uri/ =404 /index.php?$args;
        }

        location ~ ^/tutorials/([[:digit:]]+)$ {
                rewrite ^ /tutorials/index.php?article=$1 last;
        }

        # Enable: PHP FPM
        location ~ \.php$ {
                if ($request_uri ~ /tutorials/index\.php) {
                        return 302 $scheme://$host/tutorials/$arg_article;
                }

                # Allow user execution of PHP
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php/php7.0-alpha.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;
                client_max_body_size 5M;
        }
}

답변1

NGINX에는 외부 리디렉션과 내부 리디렉션이라는 개념이 있습니다.

기본적으로 리디렉션 루프를 생성하려는 것처럼 들리지만 내부 요청이 외부에서 수신되는지 여부에 따라 구별하여 해당 루프를 중단합니다.

귀하의 외부 URL 사양은 다음과 같습니다 /tutorials/([[:digit:]]+).

내부 URL 사양은 다음과 같습니다 /tutorials/index.php?article=$1.

그렇다면 다음을 원할 수 있습니다.

location ~ ^/tutorials/([[:digit:]]+)$ {
    rewrite ^ /tutorials/index.php?article=$1 last;
}
location ~ \.php$ {
    if ($request_uri ~ /tutorials/index\.php) {
        return 302 $scheme://$host/tutorials/$arg_article;
    }
    fastcgi_…
}

관련 정보