2016-09-04 2 views
1

Миллион раз задал вопрос, но после прочтения многих ответов здесь, на SO, я до сих пор не могу понять это. Мне нужно перенаправить все запросы, как показано ниже:Перенаправление www. на не-www и перенаправить все http на https с .htaccess

  1. http://domain.tld>https://domain.tld
  2. http://www.domain.tld>https://domain.tld
  3. https://www.domain.tld>https://domain.tld
  4. http://sub.domain.tld>https://sub.domain.tld (если .htaccess находиться в папке субдомена)

До сих пор я использовал код из html 5boilerplate, которые решаются WWW к не-WWW

<IfModule mod_rewrite.c> 
    RewriteCond %{HTTPS} !=on 
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] 
    RewriteRule ^(.*)$ http://%1/ [R=301,L] 
</IfModule> 

они также имеют код для HTTP к HTTPS перенаправляет, но после добавления этого куска коды (выше WWW перенаправления), страница загружается и после тайм-аута он показывает ошибка/слишком много перенаправляет

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTPS} !=on 
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] 
</IfModule> 

Я также попытался примеры, как this SO answer, но до сих пор сайт не работает. Только решение теперь использовать первый кусок кода и заменить http с https, но это не решает наиболее важный редирект (1)

тока полного .htaccess содержания:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)\/$ /$1 [R=301,L] 

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule /?([A-Za-z0-9_-]+)/?$ index.php?id=$1 [QSA,L] 

    #RewriteCond %{HTTPS} off [OR] #by uncommenting this, site stops working 
    RewriteCond %{HTTP_HOST} ^www 
    RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ 
    RewriteRule^https://%1%{REQUEST_URI} [R,L] 
</IfModule> 

ответ

1

Иногда, в зависимости от конфигурации сервера, представляется, что переменная HTTPS всегда установлена ​​в off. Это объясняет цикл, и я уже видел подобный случай здесь на SO.

Простым обходным решением было бы проверить SERVER_PORT (если вы используете по умолчанию 80 и 443) или вы также можете проверить HTTP:X-Forwarded-Proto.

Пример (1), чтобы проверить, если это неhttps:

RewriteCond %{HTTP:X-Forwarded-Proto} !https 

Пример (2), чтобы проверить, если это неhttps:

RewriteCond %{SERVER_PORT} !403 
+0

Спасибо, Джастин, пример 1 отлично работает на всех хостах, пример 2 ведет себя так же, как и другие, слишком много перенаправлений – moped

+0

так, на одном хостинге, пример 2 работает, а пример 1 - нет.хорошо иметь все возможные решения! – moped

1

Для перенаправления HTTPS и не-www в одном http-запросе, вы можете использовать

Очистить кеш браузера перед тестированием этого правила.

+0

Пробовали, но по-прежнему Я получаю «ERR_TOO_MANY_REDIRECTS» в Chrome после Clean Cache и Hard Reload. Я получаю https: //domain.tld правильно, но после этого он загружает и выдает ошибку – moped

+0

Используете ли вы облачную вспышку? – starkeen

+0

Нет, я не использую CF или любой другой CDN. Я только что установил Let's Encrypt certificate и хотел его использовать (он отлично работает, если я перейду непосредственно на страницу https: или воспользуюсь www.domain) – moped

Смежные вопросы