За последние 24 часа нас посетили 7945 программистов и 450 роботов. Сейчас ищут 243 программиста ...

Как правильно сделать редирект?

Тема в разделе "Laravel", создана пользователем Qvei, 15 фев 2020.

  1. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    Подскажите пожалуйста.. пытаюсь настроить редирект 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):
    1. RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    2. RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
    3.  
    4. RewriteCond %{ENV:HTTPS} !on
    5. RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    но этот вариант редиректит к url главной страници папку public/
    пробовал такой вариант:
    Код (Text):
    1. RewriteCond %{HTTP_HOST} ^www.my.site [NC]
    2.     RewriteRule ^(.*)$ http://my.site/$1 [L,R=301]
    но этот приводит к множественным редиректам..
    Подскажите пожалуйста как правильно настроить?
     
  2. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.238
    Симпатии:
    275
    @Qvei, попробуйте так:
    Код (Text):
    1. # Сначала - http -> https
    2. RewriteCond %{HTTPS} off
    3. RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    4. # Затем - www -> без www
    5. RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    6. RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    И заодно проверьте, не убили ли случайно использование ssl для домена...
     
  3. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    Спасибо, я разобрался немного и оказалось что проблема глубже.
    Сервер у меня Nginx а там htaccess и его rewrite rules не работают (все так говорят и гугл).
    В поддержке клиентов хостинга сказали что доступа к папке в которой Nginx.config лежит - Нет! и чтоб я пробовал через htaccess. В инструкциях по Nginx сказано что не работает htaccess полноценно или вообще..
    В общем, подскажите пожалуйста, возможно ли средствами ларавел 6 сделать полноценный редирект, чтоб гугл видел это как 301 редирект?
    Можно ли по принципу этого примера в Middlware пробовать только с www или это в AppServiceProvider надо прописывать? и вообще реально ли?

    Код (Text):
    1. class HttpsProtocol {
    2.  
    3.     public function handle($request, Closure $next)
    4.     {
    5.             if (!$request->secure() && App::environment() === 'production') {
    6.                 $request->setTrustedProxies( [ $request->getClientIp() ] );
    7.                 return redirect()->secure($request->getRequestUri());
    8.             }
    9.  
    10.             return $next($request);
    11.     }
    12. }
     
  4. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.238
    Симпатии:
    275
    Собственно, вот: redirect()
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.297
    Симпатии:
    1.024
    Адрес:
    там-сям
    @Qvei не усложняй. не вводи лишние зависимости от внешних факторов.

    nginx или apache должны быть настроены так, чтобы все отсутствующие адреса отдавать на обработку в твой index.php ибо без этого твой ларавель просто не заведётся :) и на этом всё!
    все остальные редиректы какие хочешь делай средствами Laravel. надо тебе избавляться от www.? избавляйся в Laravel.
    --- Добавлено ---
    создай middleware, который будет проверять hostname и делать redirect. примеры нагуглишь.
     
    Qvei нравится это.
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.680
    Симпатии:
    426
    @artoodetoo, ну в принципе такие вещи, как редирект с www-домена и т.п., можно делать не в скрипте, хотя это и увеличивает кол-во подряд идущих редиректов минимум на один.

    Вот это уже твой косяк. Ты нормально не настроил корень сайта в конфиге сервера (корнем должен быть public). Хотя даже без этой настройки можно избавиться от описанного побочного эффекта.
    --- Добавлено ---
    Что-нибудь такое попробуй, предварительно почистив кэш браузера:
    Код (Text):
    1. RewriteCond %{HTTP_HOST} ^www\. [NC,OR]
    2. RewriteCond %{SERVER_PORT} !=443
    3. RewriteRule ^(.*) https://my.site/$1 [R=301,L]
     
  7. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    Спасибо, нашел. Сделал как было сказано в middleware добавил файл:
    Код (Text):
    1. public function handle($request, Closure $next)
    2.     {
    3.  
    4.         if (substr($request->header('host'), 0, 4) == 'www.') {
    5.             $request->headers->set('host', 'my.site.com');
    6.  
    7.             return Redirect::to($request->path(),301);
    8.         }
    9.        
    10.         return $next($request);
    11.     }
    редиректит как положено. Только еще 1 нюанс, как правильно дописать чтоб и с http разом все шло на https у меня почему-то два редиректа получается:
    с http://www на https://www и потом уже на https://my.site.com
    вот редирект с http на https
    Код (Text):
    1. if (!$request->secure() && env('APP_ENV') === 'production') {
    2.             return redirect()->secure($request->getRequestUri(), 301);
    3.         }
    как их правильно объединить чтоб 1 редирект был с любого урл?
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    2.680
    Симпатии:
    426
    Условия из обоих ветвлений объедините OR'ом и формируйте целевой канонический адрес (для редиректа).
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.682
    Симпатии:
    1.487
    Если хостер такое говорит, значит у него над (или под, шут его) nginx-ом Apache. Поэтому htaccess будет работать. Очень распространённая конфигурация.
     
  10. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    Сделал редирект в middleware и теперь новая проблема. Главная страница отдает ошибку 500. остальные все работают нормально, но если с любой из них перейти на главную (или из гугла) то 500 | Server Error. ну вот что он хочет
     
  11. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.682
    Симпатии:
    1.487
    @Qvei Читай логи Laravel
     
  12. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    да, вот только после этих настроек в htaccess, search console не видел половину файлов sitemap. я погуглил и выяснилось что редирект не коректно работает, пробовал все существующие методы уже для htaccess. вот вроди как удалось настроить
    --- Добавлено ---
    почитал, ошибка такая: production.ERROR: syntax error, unexpected '.'
    подскажите я правильно вывожу путь картинок?

    Код (Text):
    1. data-src="{{ asset(.'/siteimages/'. $ogljadi->img) }}"
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.682
    Симпатии:
    1.487
    Конечно. Первая точка лишняя :)
     
  14. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    А можете еще подсказать..
    У меня хостинг (корневая папка в которой сайт лежит) с адресом www. Как в .env и в config/app.blade правильно адрес сайта указать с www или учитывая редирект в middleware без www. И все ссылки сайта во всех блейдах без www теперь должны быть?
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.682
    Симпатии:
    1.487
    Папка хостинга может называться хоть с ddd :) Укажи без www. Ну правда, тут моё мнение с @artoodetoo расходится, и я такие переадресации делаю средствами сервера, а не ларки, но сути дела не меняет
    --- Добавлено ---
    Ну логично, что да. Хотя, ларка сама должна правильно подставлять, если ты её инструменты используешь. А напрямую свой домен вообще не стоит указывать, не через конфиги, плохой тон.
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.297
    Симпатии:
    1.024
    Адрес:
    там-сям
    @mkramer @Qvei

    В .env есть параметр APP_URL, там прописывается адрес твоего сайта, в т.ч. доменное имя :)

    Размазывать ответственность за одну задачу по нескольким местам плохо.
    Если придётся менять доменное имя, неважно есть там префикс www или нет, достаточно будет отредактировать его в .env и только там.

    Если с apache переедешь на nginx (где не работает .htaccess), ничего не должно сломаться, если за редирект на правильный домен отвечает само приложение, а не htaccess.

    Надеюсь моя мысль понятна. Никого не заставляю, просто это логично, не правда ли. :)
     
  17. ElisDN

    ElisDN Активный пользователь

    С нами с:
    13 фев 2018
    Сообщения:
    606
    Симпатии:
    128
    Не всегда правда.

    Редиректы фреймворка работают для его маршрутов, но на адреса изображений и robots.txt они никак не действуют.
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.297
    Симпатии:
    1.024
    Адрес:
    там-сям
    Что ты этим хотел сказать, Дима? Зачем редиректам действовать на адреса изображений?
    --- Добавлено ---
    Про robots.txt в проекте есть тут
    --- Добавлено ---
    По моим понятиям, robots.txt можно и нужно отдавать программно, можно сделать его зависимым от конфигурации.
    --- Добавлено ---
    Про настройку URL картинок и прочих assets можно посмотреть здесь
    — можно делать как угодно, но чем больше попробуешь вариантов, тем очевиднее становится, что все адреса должны танцевать от настроек чтобы можно было поменять на раз-два.
     
    #18 artoodetoo, 27 фев 2020
    Последнее редактирование: 27 фев 2020
  19. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    можете подсказать... я уже просто запарился...
    Корень сайта у меня на сервере такой www.mysite.com, а в проекте (в ларавеле) корень ведет в папку паблик www.mysite.com/public/ Рабочий htaccess в папке паблик тоже. Скажите мне нужно домен с адресом www.mysite.com/public/ создать правильно?
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    10.297
    Симпатии:
    1.024
    Адрес:
    там-сям
    @Qvei домен это www.mysite.com. Ты наверное хотел сказать "как настроить виртуальный хост в админке хостинга"?
    Ответ: не знаю )))

    Могу подсказать как настроить apache (или nginx) если у тебя есть доступ к конфигам. Обычно каждый сайт описан в отдельном файле в папке /etc/apache2/sites-avalilable/ загляни туда если можешь.
     
    #20 artoodetoo, 11 мар 2020
    Последнее редактирование: 11 мар 2020
  21. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    нет, мне выше сказали что я нормально не настроил корень сайта в конфиге сервера (корнем должен быть public). вот я и спрашиваю у меня сейчас корень www.mysite.com это мне его удалить и там где в домене root directory на сервере указать новый вот такой надо www.mysite.com/public/ ? корень ларавеля у меня в паблике
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.682
    Симпатии:
    1.487
    @Qvei Если у тебя не VPS, то у каждого хостинга это по своему.
     
  23. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    Мне сказали на хостинге как.. нужно мол старый домен удалить и создать новый указав корневую папку. Я так и сделал.. Раньше было так www.mysite.com теперь стало так www.mysite.com/public/ я правильно корень в конфиге сервера указал пойму? И это я указываю где весь проект должен лежать или что? Ничего уже не понимаю
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    7.682
    Симпатии:
    1.487
    @Qvei Потому что нефиг на фреймворках писать с таким уровнем понимания происходящего...
    Корень сайта - эта папка, которая отображается на корневую папку домена при доступе через интернет. Т.е. файлы, которые выше этой папки, не могут быть запрошены при обращении по домену. А файлы, которые внутри, могут. Современные фреймворки предпочитают хранить большую часть кода как раз выше корневой папки, чтоб их невозможно было запустить напрямую. А для тех файлов, которые должны таки быть доступны при запросе, выделяется отдельная папка. В Laravel её называют public. Т.е. надо весь сайт загрузить в www.mysite.com, тогда файлы, которые должны быть в www.mysite.com/public/ туда и лягут.
     
  25. Qvei

    Qvei Новичок

    С нами с:
    10 ноя 2019
    Сообщения:
    45
    Симпатии:
    4
    так у меня все правильно и было.. последний вопрос.. по поводу настроить корень паблик это в filesystems.php делать? тут?
    Код (Text):
    1. 'disks' => [
    2.  
    3.         'local' => [
    4.             'driver' => 'local',
    5.             'root' => storage_path('app'),
    6.         ],
    7.  
    8.         'public' => [
    9.             'driver' => 'local',
    10.             'root' => storage_path('app/public'),
    11.             'url' => env('APP_URL').'/storage',
    12.             'visibility' => 'public',
    13.         ],
    14.  
    15.         's3' => [
    16.             'driver' => 's3',
    17.             'key' => env('AWS_ACCESS_KEY_ID'),
    18.             'secret' => env('AWS_SECRET_ACCESS_KEY'),
    19.             'region' => env('AWS_DEFAULT_REGION'),
    20.             'bucket' => env('AWS_BUCKET'),
    21.             'url' => env('AWS_URL'),
    22.         ],
    23.  
    24.     ],
    25.  
    26. ];