Я использую 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;
}
}
Я надеюсь, что это проясняет и помогает.