У меня есть два варианта перенаправления (возврат и перезапись), и я не уверен, какой из них рекомендуется для повышения производительности, SEO и т. Д.
## Redirect from non-www to www
server {
server_name example.com;
# Option 1
return 301 $scheme://$host$request_uri;
# Option 2
rewrite ^ http://$host$request_uri? permanent;
}
## Default server config
server {
...
listen 192.168.1.1:80 default_server;
root /www;
server_name www.example.com;
Вариант 2, похоже, работает с curl, но он не перенаправляет при вызове браузером, а код возврата - это код временного перенаправления, несмотря на то, что для директивы rewrite установлено значение permanent
:
curl -I example.com
HTTP/1.1 302 Moved Temporarily
Server: nginx
...
Location: http://www.example.com/
...
Ваш вариант 1:
return 301 $scheme://$host$request_uri;
Это именно то, что вам нужно.
Не уверен, почему rewrite ^ http://$host$request_uri? permanent;
строка приведет к 302 вместо 301. Это правильный синтаксис, чтобы заставить его вернуть 301.
Технически можно использовать оба варианта. Они могут работать.
Согласно Документация NGINX, использовать return
если вы можете. Это проще и быстрее, потому что NGINX перестает обрабатывать запрос (и ему не нужно обрабатывать регулярное выражение). Более того, вы можете указать код в 3xx серии:
return (301 | 302 | 303 | 307) url;
Если у вас есть сценарий, в котором вам нужно проверить URL-адрес с помощью регулярного выражения или нужно захватить элементы в исходном URL-адресе (которые, очевидно, не находятся в соответствующей переменной NGINX), вам следует использовать rewrite
. Вы должны это знать rewrite
возвращает только код 301 или 302.
rewrite regex URL [flag];
Вы можете узнать больше о возвращение и переписать на сайте NGINX.