Назад | Перейти на главную страницу

Проблема перезаписи Nginx с вопросительным знаком

Я использую nginx 1.14.0 в Ubuntu.

Я хочу, чтобы кто-нибудь пришел к 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 но не уверен, где именно нужно внести соответствующие изменения?

Почему это так?

Официальный ответ на 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;
    }
}

Я надеюсь, что это проясняет и помогает.