#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
директиву, поэтому я ее удалил.