Nginx удаляет WWW и отвечает на оба вопроса

У меня есть следующий фрагмент конфигурации nginx:

server {
   listen 80;

   server_name mydomain.io;

   root /srv/www/domains/mydomain.io;

   index index.html index.php;

   access_log /var/log/nginx/domains/mydomain.io/access.log;
   error_log /var/log/nginx/domains/mydomain.io/error.log;

   location ~\.php {
      try_files $uri =404;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_intercept_errors on;
      fastcgi_pass 127.0.0.1:9000;
      include /etc/nginx/fastcgi_params;
   }
}

Во-первых, как я могу заставить блок сервера отвечать наboth http://www.mydomain.io а такжеhttp://mydomain.io, Во-вторых, я хочу заставить, если они приходятhttp://www.mydomain.io перенаправить наhttp://mydomain.io.

Благодарю.

Ответы на вопрос(6)

server {
    listen 80;
    server_name www.mydomain.io;
    return 301 https://$host$request_uri;
}

server {
    listen 80;
    server_name mydomain.io;
    ...
}
 24 февр. 2017 г., 13:41
Переменная $ host в первом блоке сервера имеет значение "www.mydomain.io". Таким образом, вы перенаправляете запрос с http: // www.mydomain.io на https: // www.mydomain.io, но не на mydomain.io в соответствии с запросом

без упоминания какого-либо конкретного домена или протокола, я использовал это довольно успешно:

  # rewrite to remove www.
  if ( $host ~ ^www\.(.+)$ ) {
    set $without_www $1;
    rewrite ^ $scheme://$without_www$uri permanent;
  }

Это перенаправит:https://www.api.example.com/person/123?q=45 вhttps://api.example.com/person/123?q=45

if ($http_host ~* "^www\.(.+)$"){
    rewrite ^(.*)$ http://%1$request_uri redirect;
}

Он работает даже с несколькими доменными именами в одном и том же коде.

что лучше добавить два отдельных серверных блока, чтобы избежать ненужной проверкиif блок. Я также использую переменную $ схема, чтобы запросы HTTPS не были перенаправлены на их небезопасные аналоги.

server {
    listen 80;

    server_name www.mydomain.io;

    rewrite ^ $scheme://mydomain.io$uri permanent;
}

server {
    listen 80;

    server_name mydomain.io;

    # your normal server block definitions here
}
 27 янв. 2014 г., 14:33
Я проголосовал за это по ошибке, но это также неверный ответ. Использованиеrewrite таким образом, крайне обескураживает сама документация NGINX. Пожалуйста, смотрите ответ Райана о правильном использованииreturn 301 $scheme://domain.com$request_uri;
Решение Вопроса

server_name mydomain.io www.mydomain.io;

Во-вторых, вам понадобится это простое перенаправление:

server {
      listen 80;

      server_name www.mydomain.io mydomain.io;

      if ($host = 'www.mydomain.io' ) {
         rewrite  ^/(.*)$  http://mydomain.io/$1  permanent;
      }
 04 февр. 2013 г., 13:55
@Jrgns: такжеrewrite упоминается как одна из двух «100% безопасных вещей, которые могут быть сделаны внутри, если в контексте местоположения» в вики nginx ...
 04 февр. 2013 г., 04:09
Настоятельно не рекомендуется использовать конфигурацию if in nginx:wiki.nginx.org/IfIsEvil , Скорее используйте два серверных блока, как предложено @Gerry
 13 нояб. 2015 г., 15:20
Это (или подобное) решение приемлемо в некоторых случаях. Например, если у вас есть регулярное выражение или подстановочный знакserver_name, такие какserver_name ~^.*\.mydomain\.(com|net|org)$ вы, вероятно, не хотите дублировать код с другимиserver блоки, так что вы можете использовать что-то вродеif ($host ~ "^www\.(.*)$") { #do redirect }, Кстати, этоif не вlocation контекст;)
 26 янв. 2014 г., 03:18
Если получит достаточно отрицательных голосов, что его значение будет отрицательным, сохранит ли система его в качестве выбранного ответа?

https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, вы должны использовать:

server {
  server_name www.example.com;
  return 301 $scheme://example.com$request_uri;
}
server {
  server_name example.com;
  # [...]
}
 04 мар. 2017 г., 22:35
Ссылка на страницу вики-ловушки nginx выше не работает. Теперь должно бытьnginx.com/resources/wiki/start/topics/tutorials/config_pitfalls, Кроме того, если вы хотите найти информацию выше по этой ссылке, найдите & quot; использование if & apos ;. Спасибо Райан! Работал отлично!
 03 авг. 2015 г., 16:52
Полностью согласен!!
 04 янв. 2017 г., 00:27
Я использую более общий блок, который обрабатывает мой локальный сервер (localhost). к сожалению, это означает, что в производствеwww. не сбрасывается как я могу улучшить этот блок? (извиняюсь за плохое форматирование) server {listen 80; имя_сервера ~ ^ (www | app) \. (. *) $; схема возврата 301 $: // $ 1 $ request_uri; }
 04 мар. 2017 г., 23:07
Спасибо @junkie! Обновлено.
 08 окт. 2013 г., 08:14
Пожалуйста, проголосуйте за это, люди. Мне грустно видеть, что наименее подходящий ответ принят, второй лучший с большинством голосов ... между тем правильный ответ ослабевает. Ответ Джерри лучше, чем у Тишо, однако ответ Райана - рекомендуемый путь. Думаю об этом. Вы хотите, чтобы сервер отвечал на два запроса для каждого запроса, который он получает к www? Нет, нет.

Ваш ответ на вопрос