Термин «контекст» иногда используется для ссылки на объект, на который ссылается this . Его использование неуместно, потому что оно не подходит ни семантически, ни технически с помощью ECMAScript в этом .
«Контекст» означает обстоятельства, окружающие что-то, что добавляет смысл , или некоторая предшествующая и следующая информация, которая дает дополнительный смысл. Термин «контекст» используется в ECMAScript для ссылки на контекст выполнения , который является всеми параметрами, областью действия и этой в рамках некоторого исполняемого кода.
Это показано в разделе 10.4.2 ECMA-262 :
Установите значение ThisBinding на то же значение, что и ThisBinding для контекста выполнения вызова
, в котором четко указано, что этот является частью контекста выполнения.
Контекст выполнения предоставляет информацию, которая добавляет смысл в код, который выполняется , Он содержит гораздо больше информации о том, что только thisBinding .
Таким образом, значение этого не является «контекстом», это всего лишь одна часть выполнения контекст. Это, по сути, локальная переменная, которая может быть задана вызовом любого объекта и в строгом режиме для любого значения вообще.
Чтобы первыми заставить 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}
. В этом ответе показан соответствующий процесс
Установите в ваш .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]
Если вы находитесь в 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!
Когда вы используете этот код:
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
Это слишком большой запрос на сервер
Этот код имеет условие [OR]
для предотвращения двойных изменений в URL-адресе!
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
Если вы используете CloudFlare или аналогичный CDN, вы получите бесконечную ошибку цикла с предлагаемыми здесь решениями {HTTPS}. Если вы пользователь CloudFlare, вам нужно будет использовать это:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
=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]
https://example.com
, но, на мой взгляд, это наименее вероятный формат, который вводит пользователь. (Принятый ответ также будет иметь ту же проблему)
– Joshua Goossen
9 March 2016 в 20:45
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
http://example.com
(то есть HTTP и no www)
– MrWhite
29 September 2017 в 15:00
Это лучший способ найти прокси, а не прокси пользователей
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
Это будет работать как для https, так и для www
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
RewriteCond %{HTTPS} !on
– Jpsy
28 June 2016 в 16:41
Чтобы перенаправить 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.
Там много решений. Вот ссылка на 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
RewriteCond %{HTTPS} off
на RewriteCond %{HTTPS} !=on
, что перенаправление всегда произойдет, это кажется лучшим ответом на меня.
– Samuel Hawksby-Robinson
26 September 2016 в 14:27
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:20X-Forwarded-Proto
, чтобы проверить HTTPS вместо переменной%{HTTPS}
. Вы не сказали, какая часть вызывает цикл,www
или часть HTTPS, но это первое, что приходит мне в голову. – Michael Berkowski 15 January 2016 в 13:38RewriteEngine On
в начало файла .htaccess – David 9 April 2016 в 17:01