301 редирект на https: всё кроме robots.txt Есть решение

Shop-Script 7. Хостер: TimeWeb. Нужно 301 перенаправление на https всего, кроме robots.txt, который должен быть доступен и по http, и по https.

Добавление в .htaccess следующих параметров:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP:X-HTTPS} !1
RewriteCond %{REQUEST_URI} !^/robots.txt$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

приводит к тому, что по адресу http://site.ru/robots.txt вылетает страница https://site.ru/index.php c 404 ошибкой.

Насколько я понял происходит какой-то конфликт с уже имеющимися параметрами в .htaccess. Кто-нибудь в курсе, как эти параметры совместить и добиться желаемого результата?

11 ответов

  • 1

    А если как-то так:
    (вставлять в начало .htaccess, а не в конец.)

    RewriteCond %{HTTPS} off
    RewriteCond %{REQUEST_URI} !^/robots.txt$ [NC]
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
    • +1
      Red Cat Red Cat 30 июля 2016 19:22 #

      Нет. Такой вариант уже пробовал. Уходит в циклическую переадресацию.

  • 1
    Red Cat 1 августа 2016 14:44 # Решение

    РАБОЧИЙ ВАРИАНТ для ТАЙМВЭБА (для других хостеров параметры .htaccess могут немного отличаться):

    1) Содержимое .htaccess:

    <FilesMatch "\.md5$">
        Deny from all
    </FilesMatch>
    
    DirectoryIndex index.php
    Options -Indexes
    Options -MultiViews
    Options +FollowSymLinks
    
    AddDefaultCharset utf-8
    
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP:X-HTTPS} !1
    RewriteCond %{REQUEST_URI} !robots.txt
    RewriteRule ^(.*)$ https://SiteName.ru/$1 [R=301,L]
    
    <ifModule mod_rewrite.c>
        RewriteEngine On
        RewriteBase /
        RewriteCond %{REQUEST_URI} !\.(js|css|jpg|jpeg|gif|png|svg|ttf|eot|otf|woff|woff2)$ [or]
        RewriteCond %{REQUEST_URI} apple-touch-icon\.png$ [or]
        RewriteCond %{REQUEST_METHOD} ^(POST|PUT|COPY|MOVE|DELETE|PROPFIND|OPTIONS|MKCOL)$ [or]
        RewriteCond %{HTTP:Translate} ^.+$ [or]
        RewriteCond %{HTTP_USER_AGENT} ^(DavClnt|litmus|gvfs|davfs|wdfs|WebDAV|cadaver|Cyberduck)
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php [L,QSA]
    </ifModule>
    
    <ifModule mod_headers.c>
        <FilesMatch "\.(jpg|jpeg|png|gif|js|css|svg|ttf|eot|otf|woff|woff2)$">
            Header set Cache-Control "max-age=3153600, public"
        </FilesMatch>
    </ifModule>

    2) Чтобы работало исключение для robots.txt, нужно скопировать его содержимое из настроек приложения "Сайт" в файл robots.txt в корне сайта (файл robots.txt желательно сохранить в кодировке UTF-8). При этом важно помнить, что изменять файл robots.txt нужно уже не в настройках приложения Сайт, а по ftp.

    Содержимое robots.txt должно быть приблизительно таким:

    User-Agent: *
    Sitemap: https://SiteName.ru/sitemap.xml
    Disallow: /search/
    Disallow: /tag/
    Disallow: /cart/
    Disallow: /checkout/
    Disallow: /compare/
    Disallow: /my/
    Disallow: /signup/
    Disallow: /login/
    Disallow: /forgotpassword/
    Disallow: /webasyst/
    Disallow: */reviews/
    Disallow: *?*
    Disallow: *&*
    Allow: /category/*/?page=
    Disallow: /category/*/?page=1$
    Disallow: /category/*/?page=*&
    Host: https://SiteName.ru

    3) В результате имеем ответы сервера:

    По URL: http://SiteName.ru/, http://www.SiteName.ru/, https://www.SiteName.ru/

    • Код статуса HTTP 301 Moved Permanently
    • Location https://SiteName.ru/

    По URL: http://SiteName.ru/robots.txt, http://www.SiteName.ru/robots.txt, https://www.SiteName.ru/robots.txt

    • Код статуса HTTP 200 OK
  • 1

    Т.е. и Вы и я всё написали правильно по идее, просто загвоздка была в том, что robots.txt должен быть файлом?

    • +1
      Red Cat Red Cat 1 августа 2016 14:53 #

      В целом да, т.к. robots.txt отдаётся фреймворком из wa-data/public/site/data/SiteName.ru/robots.txt, то естественно срабатывает рерайт на index.php, а затем index.php -> https.

  • 1

    Немного странно.
    Все таки там {REQUEST_URI}, а не {REQUEST_FILENAME}. Ну да ладно.

    Наверняка, можно сделать чтоб и без вынесения robots.txt в файл работало, если подумать...


    • +1
      Red Cat Red Cat 1 августа 2016 15:10 #

      Это по рекомендации ТаймВеба. У других хостеров может быть по другому.

      Вполне возможно что и можно... но поскольку изменения в robots.txt вносятся редко, то такой "костыль" абсолютно не критичен.

      • +1

        Да, тоже сейчас столкнулся с тем, что пока не вынесешь robots.txt в отдельный файл запрет редиректа http -> https не работает для него.

  • 1
    Антон 9 августа 2016 22:29 #

    У меня такая схема работает. Хостинг SpaceWeb

    RewriteEngine on

    RewriteCond %{HTTP:HTTPS} !=on [NC]

    RewriteCond %{REQUEST_URI} !robots.txt

    RewriteRule ^(.*)$ https://мойсайт/$1 [R=301,L]

    А Sitemap разве не должен быть в конце robots?

  • 1
    Вячеслав 7 ноября 2016 19:38 #

    Помогите пожалуйста, у меня следующая проблема:

    При обращении через http на любую страницу товаров, например "http://cifrovod.ru/category/wi-fi-adaptery/" перекидывает на Location: "https://cifrovod.ru/index.php" вместо "https://cifrovod.ru/category/wi-fi-adaptery/ из за этого в маркете получаю 404 ошибки на страницы товаров. Пробовал конфиг выше вызывает бесконечную циклическую переадресацию.

    Мой .htaccess вот такой, в ЛК https галочки нет.


    <FilesMatch "\.md5$">
        Deny from all
    </FilesMatch>
    
    DirectoryIndex index.php
    Options -Indexes
    # Comment the following line, if option Multiviews not allowed here
    Options -MultiViews
    
    AddDefaultCharset utf-8
    
    <ifModule mod_rewrite.c>
        RewriteEngine On
        # Uncomment the following line, if you are having trouble
        #RewriteBase /
    
        RewriteCond %{REQUEST_URI} !\.(js|css|jpg|jpeg|gif|png|svg|ttf|eot|otf|woff|woff2)$ [or]
        RewriteCond %{REQUEST_URI} apple-touch-icon\.png$ [or]
        RewriteCond %{REQUEST_METHOD} ^(POST|PUT|COPY|MOVE|DELETE|PROPFIND|OPTIONS|MKCOL)$ [or]
        RewriteCond %{HTTP:Translate} ^.+$ [or]
        RewriteCond %{HTTP_USER_AGENT} ^(DavClnt|litmus|gvfs|davfs|wdfs|WebDAV|cadaver|Cyberduck)
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
    	
        RewriteRule ^(.*)$ index.php [L,QSA]
    RewriteCond %{HTTPS} off
    RewriteCond %{REQUEST_URI} !robots.txt
    RewriteCond %{HTTP:X_FORWARDED_PROTO} !^https$
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    </ifModule>
    
    <ifModule mod_headers.c>
        <FilesMatch "\.(jpg|jpeg|png|gif|js|css|svg|ttf|eot|otf|woff|woff2)$">
            Header set Cache-Control "max-age=3153600, public"
        </FilesMatch>
    </ifModule>
    


  • 1
    - Irina 3 мая 2017 11:12 #

    По варианту, отмеченному как правильный, у меня не вышло.
    Рассказываю как получилось.

    1. В инсталлере вебасиста (настройках) прописываем что сайт у нас с https

    2. Robots.txt используем внутренний, от вебасиста. В корне ничего не лежит.

    3. Проверяем.
    http://site.ru/robots.txt при обращении перескакивает на https://site.ru/robots.txt и отображается наш введеный robots. Т.е. тут редирект работает сразу.

    4. Делаем 301 редирект с помощью htaccess всего остального

    У меня сработала такая формула:

    RewriteEngine On
    RewriteCond %{HTTP:X-HTTPS} !1
    RewriteCond %{REQUEST_FILENAME} !^robots\.txt
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

    5. счастье : ))

Эта тема в архиве. Добавление комментариев к ней отключено.