带有问号的 Nginx 重写问题

带有问号的 Nginx 重写问题

我在 Ubuntu 上使用 nginx 1.14.0。

我希望任何人访问https://www.example.com/blog/authors/都应该始终重定向到https://www.example.com/blog,这工作正常,但如果任何人访问https://www.example.com/blog/authors/?hello(带有问号),则将被转发到https://www.example.com/blog/?hello

为什么会这样?我该如何纠正我的 nginx 配置设置,以便即使有人输入带有问号 '?' 的任何内容也https://www.example.com/blog/authors/?hello应该始终转发到。https://www.example.com/blog/

这是我的重定向规则

# Redirects to handle all of the URL patterns from the old site
    rewrite ^/blog/authors/$ /blog/$1 permanent; 

以下是我的完整 nginx 配置块文件

    server {
        listen 80;
        listen 443 ssl;
        server_name example.com www.example.com;
        access_log /var/log/nginx/example.com.access.log;

        ssl_certificate      /etc/nginx/ssl/example.com.crt;
        ssl_certificate_key  /etc/nginx/ssl/example.com.key;
        ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;

        location = /favicon.ico { access_log off; log_not_found off; }

        location /static/ {
                root /my/server/site/path;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/my/server/site/path/site.sock;

        }

        # Redirects to handle all of the URL patterns from the old site
            rewrite ^/blog/authors/$ /blog/$1 permanent; 
}

我已经看到了这个对其他问题的回答https://stackoverflow.com/questions/44782411/nginx-rewrite-question-mark但不确定我到底需要在哪里做出适当的改变?

答案1

为什么会这样?

官方答案是https://nginx.org/r/rewrite。以下是上述 URL 的直接引用...

如果替换字符串包含新的请求参数,则先前的请求参数将附加在其后。如果不希望出现这种情况,请在替换字符串末尾放置一个问号,以避免附加这些参数

因此正确的说法应该是......

rewrite ^/blog/authors/$ /blog/? permanent;

或者

rewrite ^/blog/authors/$ /blog? permanent;

...取决于您是否喜欢尾随斜线。

只有当我们有正则表达式时才rewrite需要。return由于缺乏对正则表达式的评估,所有其他重定向都可以使用更快的语句来完成。

对于你的用例,我的类似问题的现有答案可以。不过,这是完整的答案(用于不使用查询字符串进行重定向)...

location /blog/authors {
    return 301 /blog;
}

这是完整的服务器块...

server {
    listen 80;
    listen 443 ssl;

    server_name example.com www.example.com;

    root /my/server/site/path; # this line is needed to the location blocked added for redirection.

    access_log /var/log/nginx/example.com.access.log;

    ssl_certificate      /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key  /etc/nginx/ssl/example.com.key;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;

    location = /favicon.ico { access_log off; log_not_found off; }

    location /static/ {
            root /my/server/site/path;
    }

    location / {
            include proxy_params;
            proxy_pass http://unix:/my/server/site/path/site.sock;
    }

    # Redirects to handle all of the URL patterns from the old site
    location /blog/authors {
        return 301 /blog;
    }
}

我希望这能澄清并有所帮助。

相关内容