конфликт перенаправления .htaccess https на http с существующим правилом

#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. Большое спасибо