Переадресация перенаправления htaccess бесконечно [дублировать]

Проблема с «контекстом»

Термин «контекст» иногда используется для ссылки на объект, на который ссылается this . Его использование неуместно, потому что оно не подходит ни семантически, ни технически с помощью ECMAScript в этом .

«Контекст» означает обстоятельства, окружающие что-то, что добавляет смысл , или некоторая предшествующая и следующая информация, которая дает дополнительный смысл. Термин «контекст» используется в ECMAScript для ссылки на контекст выполнения , который является всеми параметрами, областью действия и этой в рамках некоторого исполняемого кода.

Это показано в разделе 10.4.2 ECMA-262 :

Установите значение ThisBinding на то же значение, что и ThisBinding для контекста выполнения вызова

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

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

Таким образом, значение этого не является «контекстом», это всего лишь одна часть выполнения контекст. Это, по сути, локальная переменная, которая может быть задана вызовом любого объекта и в строгом режиме для любого значения вообще.

250
задан Michael Berkowski 16 December 2015 в 17:32
поделиться

12 ответов

Чтобы первыми заставить HTTPS, вы должны проверить правильную переменную среды %{HTTPS} off, но ваше правило выше, затем добавляет www.. Поскольку у вас есть второе правило для принудительного использования www., не используйте его в первом правиле .

RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

О проксинге

Когда за некоторыми формами проксирования, посредством чего клиент подключается через HTTPS к прокси, балансировщику нагрузки, приложению Пассажира и т. д., %{HTTPS} может никогда не быть on и вызвать цикл перезаписи. Это связано с тем, что ваше приложение фактически получает простой HTTP-трафик, даже если клиент и балансировщик прокси / нагрузки используют HTTPS. В этих случаях проверьте X-Forwarded-Proto заголовок вместо переменной %{HTTPS}. В этом ответе показан соответствующий процесс

511
ответ дан Michael Berkowski 20 August 2018 в 16:47
поделиться
  • 1
    В некоторых случаях ваш сертификат может быть полезен только для одного домена (он может работать с www, но не без, например). В таких случаях сначала перенаправляйте на правильный домен, а затем перенаправляйте на https, иначе вы получите сообщение об ошибке сертификата в своем браузере. – Nick Benson 22 February 2014 в 05:36
  • 2
    Когда я использовал RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301], такой URL, как , exaple.com/?bla=%20 стал exaple.com/?bla=%2520 , то есть знак процента был закодирован , Попытайтесь использовать флаг NE для предотвращения двойного кодирования: RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301] – Beat 27 January 2015 в 10:20
  • 3
    это дает мне цикл переадресации на одном сервере, работает на другом. я действительно не знаю, почему – user151496 15 January 2016 в 11:26
  • 4
    @ user151496 Использует ли отказоустойчивый сервер какой-либо HTTP-прокси, например, через кеш-лак или в Пассажир? Если это так, вам может потребоваться проверить заголовок X-Forwarded-Proto, чтобы проверить HTTPS вместо переменной %{HTTPS}. Вы не сказали, какая часть вызывает цикл, www или часть HTTPS, но это первое, что приходит мне в голову. – Michael Berkowski 15 January 2016 в 13:38
  • 5
    Это сработало, как только я добавил RewriteEngine On в начало файла .htaccess – David 9 April 2016 в 17:01

Установите в ваш .htaccess файл

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
0
ответ дан Adam Kozlowski 20 August 2018 в 16:47
поделиться

Если вы находитесь в CloudFlare, убедитесь, что вы используете что-то вроде этого.

# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect

Это избавит вас от цикла перенаправления и безопасно перенаправит ваш сайт на SSL.

P.S. Это хорошая идея, если проверить mod_rewrite.c!

8
ответ дан Ahmad Awais 20 August 2018 в 16:47
поделиться
  • 1
    он не перенаправляет https: // theurlwithoutwww.com на https: // www. – thesearentthedroids 21 July 2016 в 10:58
  • 2
    Это фактически только рабочее решение, если у вас есть «добавить www», директивы заранее. Другие решения дают мне «многие переадресации». – Daniel.P. 3 July 2017 в 20:30

ПЛОХОЕ РЕШЕНИЕ И ПОЧЕМУ!

Когда вы используете этот код:

RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]

браузер переходит к:

http://example.com

, затем перенаправляется на:

https://example.com

затем перенаправляется на:

https://www.example.com

Это слишком большой запрос на сервер


BEST SOLUTION AND ANSWER

Этот код имеет условие [OR] для предотвращения двойных изменений в URL-адресе!

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
28
ответ дан Amir Forsati 20 August 2018 в 16:47
поделиться
  • 1
    «ПЛОХОЕ РЕШЕНИЕ И ПОЧЕМУ!» - Эти правила находятся в неправильном порядке. Отмените эти два правила, и это будет правильно - вы получите только одно перенаправление, а не два. – MrWhite 23 September 2017 в 10:18
  • 2
    Вы даже протестировали его? У меня есть, и я заметил, что эта проблема происходит! Я предлагаю вам протестировать его с помощью инструмента HTTP-тестера! @MrWhite – Amir Forsati 24 September 2017 в 07:05
  • 3
    Да, приведенный код приводит к двум переадресациям - я не оспариваю это - все, что я говорю, это то, что вам просто нужно отменить эти правила для решения этой проблемы, никаких других изменений не требуется. (Ответ «принятый» действительно неверен, что, по-видимому, является тем, о чем вы говорите, - директивы находятся в неправильном порядке.) – MrWhite 24 September 2017 в 08:59
  • 4
    yup @AmirForsati прав. он перенаправляется дважды, и это должен быть принятый ответ. – Zakir hussain 20 August 2018 в 09:42
  • 5

Если вы используете CloudFlare или аналогичный CDN, вы получите бесконечную ошибку цикла с предлагаемыми здесь решениями {HTTPS}. Если вы пользователь CloudFlare, вам нужно будет использовать это:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
89
ответ дан Andrew 20 August 2018 в 16:47
поделиться
  • 1
    Обратите внимание, что текущий совет на сайте поддержки Cloudflare несколько отличается: support.cloudflare.com/hc/en-us/articles/… – ColinMcDermott 22 December 2014 в 23:34
  • 2
    Согласитесь с @ h0mayun, совет Cloudflare дает результаты в цикле переадресации, тогда как этот код здесь отлично работает - спасибо! – hobailey 19 March 2015 в 00:15
  • 3
    Я запускаю angularjs на ec2. Решения с использованием RewriteCond% {HTTPS}! = On дают мне бесконечное перенаправление (не совсем понятно почему). Это решение с X-Forwarded-Proto, похоже, делает трюк. Спасибо! – Mark Watkins 4 August 2016 в 15:56
  • 4
    Я изменил =http на !=https для нашей среды. Заголовок X-Forwarded-Proto не был объявлен, если http, поэтому !=https сделал трюк. – Johnathan Elmore 15 September 2016 в 15:48

Ответ Michals работал для меня, хотя и с одной небольшой модификацией:

Проблема:

, когда у вас есть сертификат безопасности одного сайта , браузер, который пытается получить доступ к вашей странице без https: // www. (или какой-либо домен, на который распространяется ваш сертификат) будет отображаться уродливый красный предупреждающий экран до , он даже получит возможность перенаправления на безопасную и правильную страницу https.

Решение

Сначала используйте перенаправление на www (или любой домен, на который распространяется ваш сертификат), и только затем перенаправление https. Это гарантирует, что ваши пользователи не столкнутся с какой-либо ошибкой, потому что ваш браузер видит сертификат, который не распространяется на текущий URL.

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
132
ответ дан Larzan 20 August 2018 в 16:47
поделиться
  • 1
    +1, потому что это лучший вариант для этого сценария, но обратите внимание, что это не помешает той же самой проблеме, если клиент обратится к https://example.com, но, на мой взгляд, это наименее вероятный формат, который вводит пользователь. (Принятый ответ также будет иметь ту же проблему) – Joshua Goossen 9 March 2016 в 20:45
  • 2
    @Larzan: Это неправильно. Исключение для сертификации происходит только потому, что вы выполняете перенаправления 2 real . Заменить "[L, R = 301]" с "[R = 301]". Тогда правила не прерываются. L = ПОСЛЕДНИЙ – defim 12 April 2016 в 23:01
  • 3
    Если вам нужно обрабатывать https:// без www, имея сертификат только на www, просто добавьте это правило в решение: RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] Он просто возвращается к http при попытке подключиться к https://example.com чтобы избежать ошибки сертификата. – Eric Burel 27 October 2016 в 19:03
  • 4
    Эти два правила должны быть отменены в любом случае (как вы это делали), чтобы предотвратить перенаправление double при запросе http://example.com (то есть HTTP и no www) – MrWhite 29 September 2017 в 15:00
  • 5
    @EricBurel Вы не можете избежать ошибки сертификата в этом экземпляре - SSL-квитирование происходит до того, как ваш код выполнит (в первую очередь, это точка SSL). Если ваша переадресация могла выполнить before ошибку сертификата браузеров, то это означало бы, что запрос уже был сделан по небезопасному соединению, что было бы фундаментальным сбоем в модели SSL. – MrWhite 29 September 2017 в 15:03

Это лучший способ найти прокси, а не прокси пользователей

RewriteEngine On

### START WWW & HTTPS

# ensure www.
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### END WWW & HTTPS
20
ответ дан llioor 20 August 2018 в 16:47
поделиться

Это будет работать как для https, так и для www

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
-2
ответ дан Nadeem As 20 August 2018 в 16:47
поделиться
  • 1
    https! = on не работает на некоторых серверах и приводит к циклу перенаправления – user151496 15 January 2016 в 11:28
  • 2
    Знак равенства в! = On неверен. Он должен читать: RewriteCond %{HTTPS} !on – Jpsy 28 June 2016 в 16:41
  • 3
    или просто используйте off. – htm01 15 June 2017 в 07:36

Чтобы перенаправить http: // или https: // в https: // www , вы можете использовать следующее правило для всех версий apache:

RewriteEngine on

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Apache 2.4

RewriteEngine on

RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]

Обратите внимание, что переменная% {REQUEST_SCHEME} доступна для использования с apache 2.4.

9
ответ дан starkeen 20 August 2018 в 16:47
поделиться
  • 1
    Проблема !: Если HTTP_HOST уже содержит www. но схема не HTTPS, то вы в конечном итоге с www.www. в вашем хосте. – Jpsy 28 June 2016 в 16:46
  • 2
    @Jpsy вы правы. Я обновил пункт назначения перенаправления. Спасибо за ваш вклад. – starkeen 28 June 2016 в 16:55
  • 3
    Это почти то, что я искал, но я хочу сохранить общий домен как и в других примерах. Является ли это возможным? – cronoklee 7 October 2016 в 09:55

Там много решений. Вот ссылка на apache wiki, которая напрямую касается этой проблемы.

http://wiki.apache.org/httpd/RewriteHTTPToHTTPS

RewriteEngine On
# This will enable the Rewrite capabilities

RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS

RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e.  http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
23
ответ дан Vynz 20 August 2018 в 16:47
поделиться
  • 1
    Это не переписывает URL-адрес www . но он переписывает https: // – Thom 9 December 2014 в 19:14
  • 2
    Я обнаружил, изменив условие перезаписи с RewriteCond %{HTTPS} off на RewriteCond %{HTTPS} !=on, что перенаправление всегда произойдет, это кажется лучшим ответом на меня. – Samuel Hawksby-Robinson 26 September 2016 в 14:27
0
ответ дан Jackssn 31 October 2018 в 12:42
поделиться
0
ответ дан Kundan roy 31 October 2018 в 12:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: