Развернуть Angular 2 на сервере Apache

Я хочу развернуть приложение Angular 2 на сервере Apache. Я читал различные руководства, подобные этому и этому, но ни одно из них не работает. я имею npm а также ng установлен на сервере.

В двух словах, вот что я сделал:

  1. Клонированный полный репозиторий проекта на моем сервере.
  2. Установленные зависимости с помощью npm install,
  3. Используемый ng build --prod команда, и это создало dist каталог.
  4. Изменено apache корень /var/www/html/dist каталог.
  5. Включено mod_rewriteперезапустил apache и добавил это .htaccess в моем dist каталог.

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

Но только моя домашняя страница domain.com работы, другие страницы, как domain.com/login, domain.com/register и т.д. скинуть 404 ошибку. Четное domain.com/index.html/login не работает

Приложение отлично работает в моей локальной системе, где я разрабатываю его, используя ng serve, Что мне не хватает?

9 ответов

Решение

Похоже, я пропустил это в моем /etc/apache2/sites-enabled/000-default.conf файл. После добавления этого и перезапуска apacheСайт работает нормально.

<Directory "/var/www/html/dist">
  AllowOverride All
</Directory>

Создайте .htaccess файл в корневой папке и поместите его в .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>

1) Изменить базовый тег в файле index.html

<base href="./">

2) Строительный проект:

ng build --prod --base-href /myproject/

3) Добавьте свои файлы dist в "/ usr / local / apache2 / htdocs / myproject /"

4) На Apache Server 2.4 (httpd) В файле: /usr/local/apache2/conf/httpd.conf настройка "FallbackResource"

<Directory "/usr/local/apache2/htdocs">
   ...
   FallbackResource /myproject/index.html
</Directory>

полный файл "/usr/local/apache2/conf/httpd.conf":

ServerRoot "/usr/local/apache2"

Listen 80

LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so

LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so

<IfModule !mpm_prefork_module>
    #LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
    #LoadModule cgi_module modules/mod_cgi.so
</IfModule>

LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so

<IfModule unixd_module>
User daemon
Group daemon

</IfModule>
ServerAdmin you@example.com

<Directory />
    AllowOverride none
    Require all denied
</Directory>

DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
    FallbackResource /myproject/index.html
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog /proc/self/fd/2

LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog /proc/self/fd/1 common

</IfModule>

<IfModule alias_module>

    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"

</IfModule>

<IfModule cgid_module>
</IfModule>


<Directory "/usr/local/apache2/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>

<IfModule mime_module>
    TypesConfig conf/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz

</IfModule>

<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
  1. Изменить базовый тег в файле index.html

    <base href="./">

  2. Создайте сборку после этого

    ng build --prod

  3. Теперь у вас будет новая папка dist, сейчас разверните папку dist. Он должен работать.

Для Apache, чтобы перенаправить любой запрос в index.html, вам нужен файл.htaccess в корневом каталоге. Просто создайте.htaccess в вашей папке dist (того же уровня, что и index.html), я предполагаю, что это публичный корень вашего приложения, и вставьте его в файл.htaccess:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# not rewrite css, js and images
RewriteCond %{REQUEST_URI} !\.(?:css|js|map|jpe?g|gif|png)$ [NC]
RewriteRule ^(.*)$ /index.html?path=$1 [NC,L,QSA]

Теперь, независимо от того, какой путь вы запрашиваете, Apache всегда будет обслуживать ваш файл index.html, кроме запросов к действующим существующим файлам (RewriteCond %{REQUEST_FILENAME}!-F) и запросов к css, js и т. Д. (RewriteCond %{REQUEST_URI}!.(?:css|js|map|jpe?g|gif|png)$) - что необходимо исключить, потому что вы действительно хотите это. Кроме того, расширение Apache mod_rewrite должно быть включено, чтобы это работало. Чаще всего это включено. Если нет, спросите у своего хостинг-провайдера

Изменить базовый тег в файле index.html

Бежать:

ng build --prod -bh "http://example.net"

Согласно официальной документации Angular для развертывания angular (https://angular.io/guide/deployment)

Маршрутизируемое приложение должно поддерживать «глубокие ссылки».

Нам нужно включить модуль mod_rewrite, есть разные способы сделать это. На машине ubuntu мы можем запускать следующие команды:

      sudo a2enmod rewrite
sudo systemctl restart apache2

нам также необходимо разрешить переопределение в файле конфигурации, чтобы файл .htaccess мог запускаться:

        <Directory /var/www/>
  Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

Затем в файле .htaccess скопируйте следующие строки для перезаписи:

      RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html

Если он по-прежнему не работает, лучшим решением является проверка журнала ошибок, в моем случае я решил проблему, проверив журналы, в которых я обнаружил, что модуль mod_rewrite не был установлен, поэтому я установил mod_rewrite вручную, и он сработал.

Я создал общедоступный каталог распространения. Я изменил только настройку виртуального хоста apache.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName frontend.loc
    DocumentRoot /var/www/frontend/public
    <Directory "/var/www/frontend/public/">
        Options FollowSymLinks
        Allow from all
        AllowOverride All
        <IfModule mod_rewrite.c>
                RewriteEngine on
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ index.html
        </IfModule>
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

~

Откройте ваш index.html в каталоге dist после

ng build --prod

и измените базовый элемент на DNS-имя вашего сайта, например, для моего локального сервера Apache, с которого я изменил

<base href="/">

в

<base href="//localhost/angular2/ng2-cli/dist/">
Другие вопросы по тегам