Как стать автором
Обновить

Комментарии 28

поэтому проверять лучше старым браузером.

простите что доколебался до мелочи не по сабжу, но проверять такие вещи лучше вообще не браузером, для этого есть более подходящие и предсказуемо работающие утилиты, например curl

Вы правы, но не хочется сразу пугать админов, которые не умеют в rewite, заклинаниями высшего порядка, типа curl ;)

Есть вероятность, что новое поколение админов не знает, что такое rewrite, и вполне логично спрашивает, в каком месте описания ingress controller эту фигню надо писать и нафига.

И они правы.

Не наговаривайте на госадминов, IG я видел у них раз или два, обычно Nginx или Apache своей голой жопой мордой в Интернет светит, нередко любезно сообщая свою версию, что снимает вопросы, откуда у них на серверах берутся всякие интересные CVE-2016-* и более ранние ;) Так что про RewriteEngine и т.п. должны хотя бы слышать, а дальше — Гугл в помощь, было бы желание.

А можно по-подробнее, почему реверс-прокси nginx не должен светить в сеть?

Я имел в виду, что исследуемые нами веб-сервера, как правило, не «прикрыты» ничем, тем более не используют балансеры. Впрочем, и нету надо — не те задачи, не те нагрузки. А когда их прикрывают, очумелые ручки дают себя знать с новой силой (ключевое слово: Ingress).

Что делать в плане мониторинга? Так вы же расписали - фиксировать ситуацию "руки из ж..." с детализацией а) неверные перенаправления б) неверные SSL в) особые извращения (это про astrobl) и т.д.

Ну а если www и без www контентно одинаковые и технически всё ОК (SSL) - значит для человека всё хорошо.

Фиксируем, рапортуем, доносим, следим за сдвигами (медленно, но есть).

некоторые пользователи старой школы, набирающие адрес сайта руками, непременно добавляют к нему «www.» (или за них это делает браузер) и впадают в ступор, когда в ответ видят «host not found».

Кстати, я попадался наоборот с сайтами местных госорганов. Набираешь без www, а А записи для домена нет. Но это было давно.

Меня тоже терзали смутные сомнения, что сталкивался с подобным, но когда писал статью пробежался по нашим героям, и не нашел таких примеров. Даже сертификаты перевыпустили, злодеи, хотя в начале года было несколько сайтов с недействительными сертификатами для WWW.

Коммерческие CA обычно включают www в SAN даже когда их не просишь (наверное это прописано в регламентах CAB Forum, но лень искать подтверждение), а вот через ACME можно выпустить только для домена и тут вина лежит на вебмастерах.

Надо будет в следующий раз поискать корреляции…

На сколько можно судить браузер хром может проанализировать SEO сайта и выдать рекомендации в плане правильности маршрутизации и переадресаций к каноническому виду URL.

И особого смысла перебирать варианты вручную уже нет.

Плюс есть еще множество онлайн инструментов проверки. (ssllabs.com, amplify.nginx.com, mxtoolbox.com и куча других по запросу) которые дадут вменяемые рекомендации по настройке не только базовых переадресаций но и множества других параметров, о которых можно было бы только догадываться.

Плюс и Google и Яндекс в поисковых панелях дают рекомендации.

Вообще, сама по себе проблема неканонических URL скорее всего связана с тем, что в самых популярных серверных приложениях (apache и nginx) настройка условной переадресации происходит несколько неожиданным образом.

Вместо привычной для любого программиста конструкции if(запрос содержит www или http://) {переходи по ссылке https://} нужно создавать отдельные конфигурации виртуальных серверов с www и с http и в них создавать перенаправление.

Однако, все это не сильно актуально, так как все настройки все более и более автоматизируются различными панелями управления и в скором времени исчерпают себя так же как ушли в прошлое кодировки страниц и прочие неудобства.

Да и кто в наше время набирает запросы вручную?

нужно создавать отдельные конфигурации виртуальных серверов с www и с http

RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule (.*) https://ifap.ru%{REQUEST_URI} [NE,R=301]

Это для Apache, 3 строчки в .htaccess

Все верно, я скорее думал о nginx а сослался на оба сразу.

server {

listen 80;

server_name XXX www.XXX;

return 301 https://XXX$request_uri;

}

Но и с Апач тоже не все так просто. Обработка .htaccess будет не в первую очередь, а после обработки серверного блока и всевозможных <Directory ... > <Location >

Да и сам mod_rewrite очень не прост в настройке и эксплуатации, чего только стоят ключи в квадратных скобках.

В Nginx просто не помню, но тоже не бином Ньютона. С Апачем просто, мануалы как настроить переадресацию в широком ассортименте, в т.ч. на русском. Нюансы скорее возникают, в каком порядке задавать условия: сперва проверка наличия www. в адресе или схемы? И вот тут начинается нечто странное: хотя инструкция единая, если первой в ней поставить проверку на наличие www., различные чекеры не видят принудительной переадресации на https, хотя она выполняется. Почему — для меня загадка, но стоит изменить порядок проверки и чекеры довольны.

Вы правы и по Nginx и по Apache существует масса примеров, документации на любом языке, генераторов конфига и даже исходные коды серверов доступны.

Будет работать и .htaccess, и даже index.php в котором можно проверять и перенаправлять запрос.

Я говорю только о том, что привычное для любого технаря ветвление процесса в конфигах работает не эффективно, порой неожиданно, а зачастую и вовсе не работает.

Даже самые простые действия с конфигами требуют изучения документации, практических экспериментов и непрерывного тестирования.

Естественно, ресурсы с низким бюджетом или сделанные давно и формально будут содержать ошибки и пренебрегут как тестированием, так и изучением мануалов.

Однако, с течением времени все это исправится благодаря тому, что технические вопросы настройки серверов будут изолированы от рядовых пользователей. Да и сейчас уже гораздо проще использовать хостинг, нежели изобретать велосипед и копаться в настройках.

Если вначале проверять на www, то обычно редирект идёт с http на http://www, и только второй уже с http на https. Поэтому первый и не нравится чекерам. Логично сразу делать http://site → https://www.site, тогда и проверка пройдет, и один редирект сэкономится.

Смотрите:
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule (.*) ifap.ru%{REQUEST_URI} [NE,R=301]

здесь проверка сделана одним правилом: если А и/или B, то редирект, но если поменять местами строки 1 и 2, чекеры через раз недовольны.

Скорее всего дело в том, что здесь используются "ленивые вычисления" - т.е. до если первое условие выполнено, то второе вычислять и не нужно (там ведь OR).

Об этом сказано в документации, но очень завуалированно:
It has to be kept in mind that conditions follow a short circuit logic in the case of the 'ornext|OR' flag so that certain conditions might not be evaluated at all.

Поэтому в данном случае от перемены мест результат меняется.

И еще один вопрос: в RewriteRule выше - как происходит upgrade до HTTPS? Там есть еще какая-то инструкция, что вместо http нужно отдать https, или это просто случайно пропущено, и должно быть так?

RewriteRule (.*) https://ifap.ru%{REQUEST_URI} [NE,R=301]

Да, там OR, но достаточно соответствия любому из условий или обоим сразу, чтобы произошел редирект на https. Возможно Вас смутило то, что при цитировании была утеряна часть кода, которая в оригинале выглядела так:
RewriteCond %{HTTPS} !=on [OR]
RewriteCond %{HTTP_HOST} ^www\.
RewriteRule (.*) https://ifap.ru%{REQUEST_URI} [NE,R=301]

Т.е. это должно работать следующим образом:
— если http, то 301 на https без www
— если с www, то 301 на https без www
и так оно и работает, но если поменять условия местами, то, судя по реакции валидаторов, Apache сначала проверяет наличие www и переадресует на без www, а потом проверяет наличие https и выполняет второй редирект. Копать я не стал, просто поменял условия местами и все заработало как ожидается, но вот такой странный глюк словил.

Да, именно https:// в RewriteRule мне и не хватало :)

Что же касается первой части моего ответа. Скорее всего валидаторы проверяют не поведение сайта, а сам код конфигов? Тогда представьте, что в изначальной форме, где проверка на HTTPS идёт второй:

RewriteCond %{HTTP_HOST} ^www\. [OR]
RewriteCond %{HTTPS} !=on


Если сайт идёт с www, то сработает первое условие, и уже не важно, был ли сайт с HTTPS или без. Условие HTTP(s) можно не проверять, т.к. действие (RewriteRule) всё равно запускать. Именно это и называется ленивым вычислением.
Я бы сказал, что это ошибка проверяющих, а не конфига.

http://www -> fail
http://ifap -> pass
https://www -> pass
https://ifap -> pass

Ошибка проверки не должна появляться, если проверяется не текст конфига, а поведение сайта снаружи, т.к. в данном случае правило сработает, а почему - для валидатора не видно.

Скорее всего валидаторы проверяют не поведение сайта, а сам код конфигов?

Если валидатор может получить доступ к коду конфига, т.е. содержимому .htaccess, то он может даже не заморачиваться собственно проверкой, а сразу ставить «неуд» ;) .htaccess не должен быть доступен извне.

Разве эта "проблема" не решается одной CNAME записью в панели управления DNS?

CNAME  www.site.com  site.com

Настраиваем перенаправление с www на основной домен и все счастливы.

НЛО прилетело и опубликовало эту надпись здесь

поддомен – WWW – указывали на одно и то же обстоятельство

В конце 90х, когда появились сайты с пиратской музыкой/фильмами и т.д. которые занимали много места на HDD и все не влазили на один сервер, который мог быть обычный ПК, очень часто были домены WWW2., WWW3. которые шли на другой сервер. И частенько при добавлении новинок сразу делались "зеркала" на другие серваки.

Чтобы решить это проблему можно было использовать балансер перед сетевым хранилищем на том же ПК, что и веб-сервер. Балансер даже «виртуальный» мог быть.

На том единственном сайте, который меня угораздило "поддерживать", просто сделал прозрачный редирект со всевозможных вариантов на вариант с https и без www на уровне апача, без долгих раздумий и страданий

Даже и не думал, что на эту тему копья ломаются вообще

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории