#apache #.htaccess #redirect #mod-rewrite #httpd.conf
#apache #.htaccess #перенаправление #мод-перезапись #httpd.conf
Вопрос:
В настоящее время у нас есть это правило в .htaccess
RewriteEngine on <br>
RewriteCond %{REQUEST_URI} !^/site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site/$1
RewriteRule ^(/)?$ site/index [L]
Что это делает, так это то, что при любом посещении мы перенаправляем на сайт вызова вложенной папки, если страница не найдена. И когда это произойдет, URL-адрес не будет отображать сайт как подпапку.
Пример, если у нас есть
/rootFolder/site/temp.html это будет отображаться в URL-адресе как
http://www.domain.com/temp.html
Это работает нормально, но теперь нам нужно добавить перенаправление https, если пользователь посещает сайт.
Это новое правило, которое я придумал
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ https://%{HTTP_HOST}/site/$1
RewriteRule ^(/)?$ https://%{HTTP_HOST}/site/index [L]
Но проблема с этим в том, что теперь URL-адрес будет показывать подпапку сайта
https://www.domain.com/site/temp.html
Как я могу добиться, чтобы, если пользователь
http://www.domain.com/temp.html он найдет temp.html в подпапке сайта и перенаправление на https и URL будут отображаться только
https://www.domain.com/temp.html
Спасибо
Ответ №1:
Как насчет того, чтобы сделать это в два прохода, всегда перенаправляя все, что было запрошено, на https, а затем запуская ваши правила перезаписи, например:
RewriteCond %{HTTPS} off
#301 flag redirects instead of rewriting
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#leaving your original rules as is
RewriteCond %{REQUEST_URI} !^/site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /site/$1
RewriteRule ^(/)?$ site/index [L]
Комментарии:
1. это было первое, что я попробовал, и это не сработало. Странно, что это работает на моем Mac, но не работает с apache на AWS. Вот RewriteEngine правила на RewriteCond %{HTTPS} от RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{REQUEST_URI} !^/site/ RewriteCond %{REQUEST_FILENAME} ! -f перезаписать второй %{REQUEST_FILENAME} ! -d RewriteRule ^(.*)$ /site/$1 RewriteRule ^(/)?$ site/index [L]
2. согласно трассировке сети в Chrome, он запускает перенаправление https 301, но второй блок не получает вызова. Таким образом, https не отвечает (слишком долго для ответа)
3. Это сработало. Я проверил еще раз, и это сработало. Причина, по которой он не работал ранее из-за блокировки AWS на 443. Большое спасибо