Показать полную графическую версию : редирект в .htaccess с https на http с параметрами
Svetik2000
09-07-2022, 12:05
Добрый день.
Подскажите как реализовать...
есть урл вида https://my_site.ru/1/2/3
нужно сделать редирект на
http://my_site.ru/1/2/3
вариант вида
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{ENV:HTTPS} =on
RewriteCond %{QUERY_STRING} section=1
RewriteRule ^(.*)$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
и подобное пока не помог.
делает переадресацию на урл http://my_site.ru/index.php?param=3
подскажите как можно реализовать?
либо через .htaccess либо через php
dmitryst
09-07-2022, 13:04
Попробуйте Reverse Proxy, например (https://stackoverflow.com/questions/42353793/apache-reverse-proxy-https-to-http)
Svetik2000
09-07-2022, 13:06
Попробуйте Reverse Proxy, например »
Спасибо за совет, но у меня виртуальный хостинг :-(
и доступа к настройкам Апача нет
dmitryst
09-07-2022, 13:26
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
а так? Сервер, разумеется, должен иметь валидный сертификат для https протокола, иначе получите security warning
Svetik2000
09-07-2022, 13:36
В том то и дело, что сертификат невалидный, поэтому и возникла необходимость вернуть опять на http
В вашем варианте идет редирект на http://my_site.ru/index.php?param=3
1. проверка сертификата идёт до разбора http запроса, поэтому браузер будет ругаться.
2. если REQUEST_URI имеем после других преобразований, то нужно смотреть сырой запрос. 303 не кэширует.
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} \s(/1/2/3\S*)
RewriteRule ^ http://%{HTTP_HOST}%1 [R=303,L]
Svetik2000
12-07-2022, 09:31
2. если REQUEST_URI имеем после других преобразований, то нужно смотреть сырой запрос. 303 не кэширует. »
Все равно делает переадресацию на урл http://my_site.ru/index.php?param=3
301 редирект кэшируется. Смотрите Location в реальном ответе сервера. Может срабатывать какое-то предыдущее правило в конфиге.
Svetik2000
12-07-2022, 11:34
конфиг выглядит так
ErrorDocument 404 /index.php
RewriteEngine On
RewriteRule ^(.*)/(.*)/([0-9]+)$ /index.php?param=$3 [L]
AddType application/x-httpd-php .html .php
Php_Flag display_errors Off
Php_Value short_open_tag Off
ну вместо 1/2/3 регулярку свою вставить надо (если мой вариант).
RewriteCond %{THE_REQUEST} \s(/[^/]+/[^/]+/\d+\S*)
Svetik2000
13-07-2022, 12:29
Сделала
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} \s(/[^/]+/[^/]+/\d+\S*)
RewriteRule ^ http://%{HTTP_HOST}%1 [R=301,L]
но теперь вообще переадресации на http нет
после RewriteEngine On? Проверено всё, изучайте все свои конфиги.
Svetik2000
14-07-2022, 10:17
после RewriteEngine On? Проверено всё, изучайте все свои конфиги. »
конфиг выглядит так
ErrorDocument 404 /index.php
RewriteEngine On
RewriteRule ^(.*)/(.*)/([0-9]+)$ /index.php?param=$3 [L]
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} \s(/[^/]+/[^/]+/\d+\S*)
RewriteRule ^ http://%{HTTP_HOST}%1 [R=301,L]
AddType application/x-httpd-php .html .php
Php_Flag display_errors Off
Php_Value short_open_tag Off
Правила должны быть более конкретные, иначе будут нежелательные редиректы. Правило /*/*/111 слишком общее. Внешние редиректы лучше ставить раньше внутренних, до изменений путей и переменных. Чуток подправлено.
RewriteCond %{HTTPS} on
RewriteCond %{THE_REQUEST} \s(/[^/\s]+/[^/\s]+/\d+\S*)
RewriteRule ^ http://%{HTTP_HOST}%1 [R=303,L]
RewriteRule ^/?([^/]+)/([^/]+)/(\d+)$ /index.php?param=$3 [L]
Svetik2000
14-07-2022, 11:45
сделала как в вашем примере. все равно редирект с https на http не работает
Какая конфигурация серверов? Если апач за nginx'ом каким-нибудь, то по %{HTTPS} не узнать наверное про наличие https.
Svetik2000
14-07-2022, 12:36
как это посмотреть на виртуальном хостинге?
посмотрите вывод phpinfo() из-под https, есть ли там HTTPS или какой-нибудь HTTP_X_FORWARDED_PROTO
Svetik2000
14-07-2022, 14:13
это имеете ввиду?
Тогда что-то другое. Какая версия Apache? В старых версиях нет многих символов регулярных выражений. Может нет \d (означает любую цифру), тогда попробуйте ваш бывший вариант [0-9]. Насчёт пробельного символа \s не уверен, но можно попробовать заменить на простой пробел со слешем "\ ". \S (большой S) это наоборот любой непробельный символ.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.