Подскажите пожалуйста.. пытаюсь настроить редирект 301 с www на без www (laravel 6, сервер nginx), на хостинге говорят что к файлу nginx.config доступа нет и что это можно в htaccess сделать а google говорит что на nginx серверах редирект в htaccess не делается.. если на стороне сервера то только в файле nginx.config. Я пробовал уже кучу комбинаций но все они работают так что например pagespeed https://developers.google.com/speed/pagespeed/insights/?hl=RU говорит что слишком много редиректов.. пробовал так: Код (Text): RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ https://%1/$1 [R=301,L] RewriteCond %{ENV:HTTPS} !on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] но этот вариант редиректит к url главной страници папку public/ пробовал такой вариант: Код (Text): RewriteCond %{HTTP_HOST} ^www.my.site [NC] RewriteRule ^(.*)$ http://my.site/$1 [L,R=301] но этот приводит к множественным редиректам.. Подскажите пожалуйста как правильно настроить?
@Qvei, попробуйте так: Код (Text): # Сначала - http -> https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # Затем - www -> без www RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/$1 [R=301,L] И заодно проверьте, не убили ли случайно использование ssl для домена...
Спасибо, я разобрался немного и оказалось что проблема глубже. Сервер у меня Nginx а там htaccess и его rewrite rules не работают (все так говорят и гугл). В поддержке клиентов хостинга сказали что доступа к папке в которой Nginx.config лежит - Нет! и чтоб я пробовал через htaccess. В инструкциях по Nginx сказано что не работает htaccess полноценно или вообще.. В общем, подскажите пожалуйста, возможно ли средствами ларавел 6 сделать полноценный редирект, чтоб гугл видел это как 301 редирект? Можно ли по принципу этого примера в Middlware пробовать только с www или это в AppServiceProvider надо прописывать? и вообще реально ли? Код (Text): class HttpsProtocol { public function handle($request, Closure $next) { if (!$request->secure() && App::environment() === 'production') { $request->setTrustedProxies( [ $request->getClientIp() ] ); return redirect()->secure($request->getRequestUri()); } return $next($request); } }
@Qvei не усложняй. не вводи лишние зависимости от внешних факторов. nginx или apache должны быть настроены так, чтобы все отсутствующие адреса отдавать на обработку в твой index.php ибо без этого твой ларавель просто не заведётся и на этом всё! все остальные редиректы какие хочешь делай средствами Laravel. надо тебе избавляться от www.? избавляйся в Laravel. --- Добавлено --- создай middleware, который будет проверять hostname и делать redirect. примеры нагуглишь.
@artoodetoo, ну в принципе такие вещи, как редирект с www-домена и т.п., можно делать не в скрипте, хотя это и увеличивает кол-во подряд идущих редиректов минимум на один. Вот это уже твой косяк. Ты нормально не настроил корень сайта в конфиге сервера (корнем должен быть public). Хотя даже без этой настройки можно избавиться от описанного побочного эффекта. --- Добавлено --- Что-нибудь такое попробуй, предварительно почистив кэш браузера: Код (Text): RewriteCond %{HTTP_HOST} ^www\. [NC,OR] RewriteCond %{SERVER_PORT} !=443 RewriteRule ^(.*) https://my.site/$1 [R=301,L]
Спасибо, нашел. Сделал как было сказано в middleware добавил файл: Код (Text): public function handle($request, Closure $next) { if (substr($request->header('host'), 0, 4) == 'www.') { $request->headers->set('host', 'my.site.com'); return Redirect::to($request->path(),301); } return $next($request); } редиректит как положено. Только еще 1 нюанс, как правильно дописать чтоб и с http разом все шло на https у меня почему-то два редиректа получается: с http://www на https://www и потом уже на https://my.site.com вот редирект с http на https Код (Text): if (!$request->secure() && env('APP_ENV') === 'production') { return redirect()->secure($request->getRequestUri(), 301); } как их правильно объединить чтоб 1 редирект был с любого урл?
Если хостер такое говорит, значит у него над (или под, шут его) nginx-ом Apache. Поэтому htaccess будет работать. Очень распространённая конфигурация.
Сделал редирект в middleware и теперь новая проблема. Главная страница отдает ошибку 500. остальные все работают нормально, но если с любой из них перейти на главную (или из гугла) то 500 | Server Error. ну вот что он хочет
да, вот только после этих настроек в htaccess, search console не видел половину файлов sitemap. я погуглил и выяснилось что редирект не коректно работает, пробовал все существующие методы уже для htaccess. вот вроди как удалось настроить --- Добавлено --- почитал, ошибка такая: production.ERROR: syntax error, unexpected '.' подскажите я правильно вывожу путь картинок? Код (Text): data-src="{{ asset(.'/siteimages/'. $ogljadi->img) }}"
А можете еще подсказать.. У меня хостинг (корневая папка в которой сайт лежит) с адресом www. Как в .env и в config/app.blade правильно адрес сайта указать с www или учитывая редирект в middleware без www. И все ссылки сайта во всех блейдах без www теперь должны быть?
Папка хостинга может называться хоть с ddd Укажи без www. Ну правда, тут моё мнение с @artoodetoo расходится, и я такие переадресации делаю средствами сервера, а не ларки, но сути дела не меняет --- Добавлено --- Ну логично, что да. Хотя, ларка сама должна правильно подставлять, если ты её инструменты используешь. А напрямую свой домен вообще не стоит указывать, не через конфиги, плохой тон.
@mkramer @Qvei В .env есть параметр APP_URL, там прописывается адрес твоего сайта, в т.ч. доменное имя Размазывать ответственность за одну задачу по нескольким местам плохо. Если придётся менять доменное имя, неважно есть там префикс www или нет, достаточно будет отредактировать его в .env и только там. Если с apache переедешь на nginx (где не работает .htaccess), ничего не должно сломаться, если за редирект на правильный домен отвечает само приложение, а не htaccess. Надеюсь моя мысль понятна. Никого не заставляю, просто это логично, не правда ли.
Не всегда правда. Редиректы фреймворка работают для его маршрутов, но на адреса изображений и robots.txt они никак не действуют.
Что ты этим хотел сказать, Дима? Зачем редиректам действовать на адреса изображений? --- Добавлено --- Про robots.txt в проекте есть тут --- Добавлено --- По моим понятиям, robots.txt можно и нужно отдавать программно, можно сделать его зависимым от конфигурации. --- Добавлено --- Про настройку URL картинок и прочих assets можно посмотреть здесь — можно делать как угодно, но чем больше попробуешь вариантов, тем очевиднее становится, что все адреса должны танцевать от настроек чтобы можно было поменять на раз-два.
можете подсказать... я уже просто запарился... Корень сайта у меня на сервере такой www.mysite.com, а в проекте (в ларавеле) корень ведет в папку паблик www.mysite.com/public/ Рабочий htaccess в папке паблик тоже. Скажите мне нужно домен с адресом www.mysite.com/public/ создать правильно?
@Qvei домен это www.mysite.com. Ты наверное хотел сказать "как настроить виртуальный хост в админке хостинга"? Ответ: не знаю ))) Могу подсказать как настроить apache (или nginx) если у тебя есть доступ к конфигам. Обычно каждый сайт описан в отдельном файле в папке /etc/apache2/sites-avalilable/ загляни туда если можешь.
нет, мне выше сказали что я нормально не настроил корень сайта в конфиге сервера (корнем должен быть public). вот я и спрашиваю у меня сейчас корень www.mysite.com это мне его удалить и там где в домене root directory на сервере указать новый вот такой надо www.mysite.com/public/ ? корень ларавеля у меня в паблике
Мне сказали на хостинге как.. нужно мол старый домен удалить и создать новый указав корневую папку. Я так и сделал.. Раньше было так www.mysite.com теперь стало так www.mysite.com/public/ я правильно корень в конфиге сервера указал пойму? И это я указываю где весь проект должен лежать или что? Ничего уже не понимаю
@Qvei Потому что нефиг на фреймворках писать с таким уровнем понимания происходящего... Корень сайта - эта папка, которая отображается на корневую папку домена при доступе через интернет. Т.е. файлы, которые выше этой папки, не могут быть запрошены при обращении по домену. А файлы, которые внутри, могут. Современные фреймворки предпочитают хранить большую часть кода как раз выше корневой папки, чтоб их невозможно было запустить напрямую. А для тех файлов, которые должны таки быть доступны при запросе, выделяется отдельная папка. В Laravel её называют public. Т.е. надо весь сайт загрузить в www.mysite.com, тогда файлы, которые должны быть в www.mysite.com/public/ туда и лягут.
так у меня все правильно и было.. последний вопрос.. по поводу настроить корень паблик это в filesystems.php делать? тут? Код (Text): 'disks' => [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), ], 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), 'url' => env('AWS_URL'), ], ], ];