Угловой 4 удалить хэш (#) из URL
Мой app.module.ts
@NgModule({
.......
providers: [
....
{ provide: LocationStrategy, useClass: HashLocationStrategy},
....
]
});
Когда я удаляю эту часть, она работает на моем локальном хосте, но после выполнения ng build или ng build --prod, когда я обновляю страницу или h5, она не работает. Это дает ошибку 404. Я хочу удалить хеш (#) из моего URL. Любое решение?
1 ответ
Давайте поговорим о разнице между HashLocationStrategy
а также PathLocationStrategy
, Для получения дополнительной информации, проверьте документы
Angular по умолчанию использует PathLocationStrategy
,
Допустим, у вас есть следующие маршруты в вашем приложении.
const routes: Route[] = [{
path: '',
redirectTo: 'home',
pathMatch: 'full'
},
{
path: 'home',
component: HomeComponent
}];
Когда вы направляетесь к этому компоненту, ваша адресная строка будет выглядеть localhost:4200/home
, Если вы использовали HashLocationStrategy
это будет выглядеть localhost:4200/#home
, Итак, какая здесь разница?
PathLocationStrategy
Когда вы находитесь на странице
Home
и ударилF5
кнопку или обновить страницу, браузер сделает запросlocalhost:4200/home
который будет обрабатываться angular-cli, и вы получитеHomeComponent
вернулся.HashLocationStrategy
Точно так же, когда вы нажмете
F5
, браузер сделает запросlocalhost:4200
на этот раз, потому что он игнорирует все, что приходит после#
Если вы не хотите иметь #
, затем удалите ту часть, которую вы указали. Это будет PathLocationStrategy
по умолчанию. Однако это заставляет нас расстаться, когда вы запускаете приложение за пределами angular-cli
что означает построить и обслуживать его с какого-то сервера. Допустим, вы создали приложение с ng build
и у вас есть ваши минимизированные, скомпилированные файлы javascript. Вы развернули на некотором сервере, который работает yourdomain.com
Кроме того, вы помещаете это встроенное связанное угловое приложение в некоторый URL, чтобы люди могли получить доступ к вашему приложению из yourdomain.com/ng-app
Здесь все хорошо. Даже когда вы направляетесь в HomeComponent
, это будет работать, и ваша адресная строка будет выглядеть yourdomain.com/ng-app/home
, Тем не менее, когда вы нажмете F5
в этот момент ваш браузер отправит запрос yourdomain.com/ng-app/home
который не существует на вашем сервере, потому что вы обслуживаете свое приложение из /ng-app
, Вы должны сделать некоторые настройки на стороне сервера, чтобы вы могли обслуживать все, что начинается с /ng-app/**
,
Например, мое весеннее приложение имеет этот метод, который возвращает угловое приложение,
@GetMapping("/ng-app/**")
Поэтому, когда мой сервер получает запрос, который начинается с /ng-app
, он просто передает это в угловое приложение, которое будет обрабатывать правильный маршрут.
Надеюсь, это проясняет это для вас.
You should rewrite the URL rules.For every server rules will be diifferent
and you can try this for IIS.
=> Create web.config in src folder and copy below code.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Angular 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="./index.html" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
=> angular-cli.json file like this:
"assets": [
"assets",
"favicon.ico",
"web.config"
],
=> Let’s build: ng build --prod