Как перенаправить на https index.html с помощью .htacess

#vue.js #.htaccess #single-page-application #vue-cli

Вопрос:

У меня есть спа-салон vue-laravel. Чтобы приложение vue правильно работало в режиме истории, мне нужно убедиться, что оно перенаправляется на index.html. Я следую тому, что говорится в документации vue cli для этого, и использую этот фрагмент кода в файле .htaccess

 <IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>
 

В то же время мне также нужно убедиться, что все http-запросы перенаправляются на https, для чего мой хостинг hostgator предоставил мне этот фрагмент кода.

 RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTP_HOST} ^subdomain.domain.com$
RewriteRule ^/?$ "https://subdomain.domain.com/" [R=301,L]
 

Проблема в том, что эти 2 части кода, похоже, не работают вместе. Однако каждый из них работает, когда другой закомментирован.

Ответ №1:

Порядок важен. Каноническое перенаправление (HTTP на HTTPS) должно быть выполнено до перезаписи index.html .

 RewriteCond %{HTTP_HOST} ^subdomain.domain.com$
RewriteRule ^/?$ "https://subdomain.domain.com/" [R=301,L]
 

Однако это правило в написанном виде перенаправляет само на себя и приведет к циклу перенаправления! (Это не является частью перенаправления HTTP на HTTPS.)

Вам не нужна <IfModule> оболочка, и вам не нужно повторять RewriteEngine директиву.

Другими словами:

 RewriteEngine On

# Redirect HTTP to HTTPS
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

# Front-Controller
RewriteRule ^index.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
 

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