NGINX 重写规则不起作用

NGINX 重写规则不起作用

我正在使用 NGINX 重写规则,但无论我做什么,事情都不会起作用。

当前链接:

  • /tutorials/index.php?article=2

我多么想要它

  • /tutorials/2

我的 - 当前 - NGINX 重写conf/规则:

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

相关内容