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_…
}

関連情報