web-dev-qa-db-ja.com

Angular 5:ルートの末尾にスラッシュを許可する

古いWebサイトをAngularで更新していますが、満たす必要のある要件の1つは、すべてのルートを以前と同じままにすることです(SEOの目的で)。

古いウェブサイトのルートの多くはスラッシュで終わり(/my/route/のように)、一部は.htmlのように/my/route.htmlで終わります。

問題は、routerLinkがスラッシュで終わるすべてのルートの最後のスラッシュを削除することです(私のルートは現在/my/routeです)。

末尾のスラッシュを保持するためにrouterLinkを作成するにはどうすればよいですか?

簡単な例をここで見ることができます: AngularTrailingSlash

6
Marc Brillault

以下をあなたのapp.module.tsに追加しました

import {Location, PathLocationStrategy} from '@angular/common';


const _orig_prepareExternalUrl = PathLocationStrategy.prototype.prepareExternalUrl;

PathLocationStrategy.prototype.prepareExternalUrl = function(internal) {
  const url = _orig_prepareExternalUrl.call(this, internal);

  if (url === '') {
    return url;
  }

  console.log('For ' + internal + ' we generated ' + url);
  if (url.endsWith('.html')) {
      return url;
  }

  if (url.endsWith('/')) {
    return url;
  }


  return url + '/';

};

Location.stripTrailingSlash = function (url) {
    const /** @type {?} */ match = url.match(/#|\?|$/);
    const /** @type {?} */ pathEndIdx = match && match.index || url.length;
    const /** @type {?} */ droppedSlashIdx = pathEndIdx - (url[pathEndIdx - 1] === '/' ? 1 : 0);
    const first = url.slice(0, droppedSlashIdx);
    const last = url.slice(pathEndIdx);

    if (first.endsWith('.html')) {
        return first + last;
    }

    return first + '/' + last;

};

そして、.htmlがない場合は、末尾にスラッシュを付けて機能するようになりました。

2
Tarun Lalwani

さらに改善されたコード(Umeshのコードに基づく)。

main.tsの上に追加:

import { Location } from "@angular/common";
// Prevent stripping of trailing slash
Location.stripTrailingSlash = function stripTrailingSlashNew(url: string) {
  return url;
};
2
edwin

以下のコードは私のために働いた:

export const contactUsRoutes: Routes = [
    {
        path: 'contact-us/.', component: ContactUsComponent
    }
];

。 。

<a [routerLink]="['/contact-us/.']">Contact us</a>

そして、main.tsに以下のコードを追加します。

import { Location } from '@angular/common';

const __stripTrailingSlash = (Location as any).stripTrailingSlash;
(Location as any).stripTrailingSlash = function _stripTrailingSlash(url: string): string {
  const queryString$ = url.match(/([^?]*)?(.*)/);
  if (queryString$[2].length > 0) {
    return /[^\/]\/$/.test(queryString$[1]) ? queryString$[1] + '.' + queryString$[2] : __stripTrailingSlash(url);
  }
  return /[^\/]\/$/.test(url) ? url + '.' : __stripTrailingSlash(url);
};

私はこの解決策について以下のリンクを参照しました:

https://stackblitz.com/github/ssatz/Angular5-Preserve-Trailing-Slash

2
Darshana

このコードをmain.tsファイルに追加して、routerLinkの末尾のスラッシュを保持します。

import { Location } from '@angular/common';
const __stripTrailingSlash = (Location as any).stripTrailingSlash;
(Location as any).stripTrailingSlash = function _stripTrailingSlash(url: string): string {
  return /[^\/]\/$/.test(url) ? url : __stripTrailingSlash(url);
}

// import main ng module
// bootstrap on document ready
0
Umesh M Gowda

次のようにAppModuleで拡張されたLocationクラスを試してください。

app.module.ts:

import { Injectable } from '@angular/core';
import { Location } from '@angular/common';

@Injectable()
export class UnstripTrailingSlashLocation extends Location {
  public static stripTrailingSlash(url: string): string {
    return url;
  }
}
Location.stripTrailingSlash = UnstripTrailingSlashLocation.stripTrailingSlash;

@NgModule({
            ...
0
Hasan Fathi