問題
- FriendlyURL ポートレットが一部の URL を正しく解析していません。
- URL を使いやすくするためにモジュールを実装するときに、routes.xml で定義する必要があるパターンの種類が明確でない場合があります (この実装に関する追加情報を参照してください)。
- たとえば、私の routes.xml が次のようになっている場合:
<routes>
<route>
<pattern>/{groupId}/{articleURLTitle}</pattern>
</route>
</routes> - 次の URL は ではなく であり、正しく解析されます。
http://localhost:8080/detail/-/content/20125/test.cc
- そして、ログに次のようなメッセージが表示されます ( DefaultFriendlyURLMapper クラスのログ レベルが WARNに設定されている場合)。
2021-07-26 14:46:06.891 WARN [http-nio-7100-exec-10][DefaultFriendlyURLMapper:150] No route could be found to match URL /20125/test.cc
- これは、 routes.xml で定義されたパターンが正しくないためです。そのため、Liferay は不適切なマッチャーを選択します。
Environment
- Liferay DXP
解決策
- ファイル routes.xml で定義されたパターンは、正しいマッチャを適用するための鍵となるため、 FriendlyURL ポートレットが処理する URL の種類を知ることが重要です。
- Liferay で利用可能なマッチャーは次のとおりです。
- それぞれが特定のマッチング ルールを定義します。たとえば、 DefaultMatcher 、URL にドット (".") を含めることはできません。
- どちらか一方を使用するために適用されるロジックは、ここでは と定義されています。
- 前の例では、パターンにコロン (":") が含まれていないため、 DefaultMatcher が設定されます。 そして、このマッチャーは "は" を拒否するので、ドットを含む URL:
if ((c == CharPool.SLASH) || (c == CharPool.PERIOD)) {
URL http://localhost:8080/detail/-/content/20125/test.cc は解析されません。
return false;
} - 解析されたドットを含む URL を取得するには、例 に対して 次のパターンで定義する必要があります。
<pattern>/{groupId}/{templateKey}/{articleURLTitle:[^/]+}</pattern>
したがって、 NotSlashMatcher が に選択され、解析ではドットが拒否されません。
追加情報
- https://help.liferay.com/hc/es/articles/360017885992-Making-URLs-Friendlier
- StringParserFragment.java ロジック。