Проект Angular 6 отображает ошибку 404 после обновления

Обновление моей страницы angular дает мне ошибку сервера 404, то же самое происходит, если я вручную перехожу к каталогу в строке поиска. Я размещаю через сервер IIS.

Эта проблема возникает только тогда, когда я создаю свой угловой проект с помощью ng build --prod, а затем загружаю его на свой веб-сервер. Многие люди говорят, что вы должны использовать метод хеша, но я не хочу, чтобы хэш отображался внутри моего URL-адреса, и это очень старый метод. Некоторые люди также говорят, что я должен изменить свой тег <base> в своем <head>, но это не сработало.

Вот мой тег <head> из моего index.html, если это полезно.

<head>
<!-- META DATA -->
<meta charset = "utf-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1">

<!-- APP -->
<title>SebastianElstadt</title>
<base href = "/">
<link rel = "icon" type = "image/x-icon" href = "assets/images/app-icon.png">

<!-- STYLES -->
<link rel = "stylesheet" href = "[fontawesome cdn]">
</head>

Я также использую компонент, который отображается, если введенный URL-адрес не соответствует ни одному из моих определенных путей. Но он не отображается.

Итак, подведем итог: всякий раз, когда я обновляю свою страницу или вручную перемещаюсь по строке поиска на моем сайте angular, она отображает страницу 404 Server Error. И я не хочу использовать хеш-метод.

"Старый" не значит "Плохой". Как новичок, я бы предпочел увидеть хеш в своем URL-адресе, чем перенастраивать свой сервер. Но чтобы ответить вам, это проблема HTTP-сервера, а не проблема Angular. Вы должны использовать правильные теги для идентификации вашего сервера, иначе вы не получите надлежащего ответа.

user4676340 01.02.2019 14:50

Вам нужно использовать Стратегия расположения пути

Arcteezy 01.02.2019 14:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
3 864
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Я не знаю, какой сервер вы используете, но если вы не хотите использовать хеш-метод, каждый запрос должен быть перенаправлен на ваш index.html, где работает приложение angular.

Если сервер не может найти маршрут /your/sub/route и пишет "404 not found".

Вы должны проверить https://angular.io/guide/развертывание для развертывания приложения Angular. Ему нужна определенная конфигурация, основанная на вашем http-сервере. Так, например, для Apache вам понадобится следующий файл .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

Я выполнил шаги по настройке файла web.config для своего сервера IIS, но теперь всякий раз, когда я перехожу на свой веб-сайт, он просто отображает 500 — внутренняя ошибка сервера.

user10728458 01.02.2019 15:17

@Sebastian, тогда, вероятно, есть ошибка в вашем файле web.config. Я не знаю, какова ваша конфигурация и как вы структурировали свою серверную среду, поэтому трудно сказать, если вы не поделитесь дополнительной информацией об этом.

Rens 01.02.2019 15:33
Ответ принят как подходящий

Вы можете решить эту проблему, создав файл web.config:

<?xml version = "1.0" encoding = "UTF-8"?>
<configuration>
<system.webServer>
    <defaultDocument>
        <files>
            <clear />
            <add value = "index.html" />
        </files>
    </defaultDocument>
    <rewrite>
      <rules>
        <rule name = "AngularJS Routes" stopProcessing = "true">
          <match url = ".*" />
          <conditions logicalGrouping = "MatchAll">
            <add input = "{REQUEST_FILENAME}" matchType = "IsFile" negate = "true" />
            <add input = "{REQUEST_FILENAME}" matchType = "IsDirectory" negate = "true" />   
          </conditions>
          <action type = "Rewrite" url = "/" logRewrittenUrl = "true" />
        </rule>
      </rules>
    </rewrite>
 <security>
        <requestFiltering allowDoubleEscaping = "true">
            <fileExtensions>
                <add fileExtension = ".json" allowed = "true" />
            </fileExtensions>
        </requestFiltering>
</security>
    <directoryBrowse enabled = "true" />
<staticContent>
<remove fileExtension = ".woff" />
<remove fileExtension = ".woff2" />
<mimeMap fileExtension = ".woff" mimeType = "application/font-woff" />
<mimeMap fileExtension = ".woff2" mimeType = "application/font-woff2" />
</staticContent>
</system.webServer>
</configuration>

.Net Core с ошибкой Angular 4: 404 при обновлении браузера

Я просто хочу убедиться, что я должен изменить что-то здесь и там в этом коде или скопировать его напрямую?

user10728458 01.02.2019 16:07

Вы можете использовать его как есть. Также возможно автоматически сгенерировать этот файл с помощью IIS.

mruanova 01.02.2019 16:08

Я добавил заголовок для файла веб-конфигурации, чтобы вы могли использовать его напрямую.

mruanova 01.02.2019 16:09

Спасибо, но всякий раз, когда я добавляю файл web.config и добавляю этот код, он загружает 500 - Внутренняя ошибка сервера.

user10728458 01.02.2019 16:13

Я пытаюсь развернуть одностраничное приложение Angular 6 в SharePoint и получаю ту же проблему, что и исходный постер. Я добавил файл web.config в тот же каталог, что и мой файл index.html. Есть идеи, что не так?

new_programmer_22 20.08.2019 19:04

если вы находитесь на такой странице, как mywebsite/example/1, и нажимаете «Обновить» в браузере, иногда он не попадает в маршрутизатор, и в angular вы ничего не можете сделать, чтобы это исправить, но вы можете создать папку с именем «пример» и внутри поместите еще один index.html с простым скриптом javascript, который говорит window.location.href=http://mywebsite/index.html, и это дает вам представление о том, что происходит, а также обходной путь.

mruanova 20.08.2019 20:38

Стоит отметить, что это решение требует установки «модуля перезаписи» в вашем IIS. Вы можете найти его в Google или использовать инструмент «установщик веб-платформы».

JoeCool 09.12.2019 15:29

Это решит вашу проблему, добавьте файл .htaccess в корень вашего проекта.

и поместите этот контент

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews -Indexes
</IfModule>

RewriteEngine On

# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]

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

Другие вопросы по теме