7.9 中自定义 URLRewrite 规则的问题

Issues with custom URLRewrite rules in 7.9

目前我在使用 ISH 7.9 中的自定义 URL 重写规则时遇到了一些问题。

对于我们的一些环境,它工作正常(比如本地和测试),但在 ACC 和 PROD 上,它似乎只是在系统多次 deploys/restarts 之后才偶尔工作。

我们创建了一个自定义盒式磁带,其中包含 deploy.gradle 文件以从原始盒式磁带中排除文件 urlrewriterules.xmldomainsplittings.xmlsyndication-targets.properties。它们被 share/system/config/cluster 文件夹中的自定义文件替换。 urlrewriterules.xml 中应用的静态规则总是工作正常。但是,来自自定义 Java classes 的规则有时无法通过 RewriteRuleFactoryImpl 返回以下错误来很好地加载:

[2018-11-07 08:20:37.906 +0100] WARN localhost ES1 appserver0 [ShipSupport-ebusiness-Site] [-] com.intershop.component.urlrewrite.internal.factory.RewriteRuleFactoryImpl [] [Storefront] [wJ5DCcg2CM5DCZPUUqdNu2D2fj8NZHaXjvP9qIZb] [yFAAAFvikjkOsqjA-0-00] "yFAAAFvikjkOsqjA-0-00" An implementation of rewrite rule type 'CustomCategory' does not exist.

urlrewriterules.xml 中调用此 java class 的代码部分如下:

<!-- Custom Category Rule /c/<NAME_OF_LOWEST_CATEGORY> -->
<rule type="CustomCategory" priority="1000" name="custom category rule">
    <configurations>
       <configuration id="pathPrefix">/catalog</configuration>
        <configuration id="partsCatalogID">4393</configuration>
   </configurations>
</rule>

我们也有在我们自己的墨盒中很好地创建的 classes,例如扩展 BaseRewriteRuleCustomCategoryRewriteRule。 URL 为这些通道启用了重写,我们总是使启用它的通道中的缓存无效。

CustomCategory 的扩展(在同一个墨盒中定义)定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<extensionpoint:ExtensionPointModel xmlns:extensionpoint="http://www.intershop.de/extensionpoint/2011" name="CustomCategoryRewriteRule"> 
  <extensionBindings type="java" extensionPoint="com.intershop.component.urlrewrite.capi.RewriteRule-RewriteRule.create" extension="com.package.CustomCategoryRewriteRule" priority="1"/>
</extensionpoint:ExtensionPointModel>

app-extension.component 也在同一个墨盒中定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://www.intershop.de/component/2010" scope="global">
    <fulfill requirement="selectedCartridge" value="cartridge_name" of="intershop.SLDSystem.Cartridges"/>
    <fulfill requirement="selectedCartridge" value="cartridge_name" of="intershop.EnterpriseBackoffice.Cartridges"/>
</components>

我们按照这篇文章来确认如何做到这一点:https://support.intershop.com/kb/index.php/Display/B28069我们在另一个项目中也能正常工作,但使用的是 Intershop 7.8

您知道可能是什么原因吗?

谢谢!

除了实现之外,您还需要在<cartridge>/staticfiles/cartridge/extensions中创建一个扩展文件。这是查找机制的重写规则的实际注册。请参阅以下示例:

<?xml version="1.0" encoding="UTF-8"?>
<extensionpoint:ExtensionPointModel xmlns:extensionpoint="http://www.intershop.de/extensionpoint/2011" name="CustomRewriteRule.extension">
    <extensionBindings type="java" extensionPoint="com.intershop.component.urlrewrite.capi.RewriteRule-RewriteRule.create" extension="com.package.CustomCategoryRewriteRule " priority="1"/>
</extensionpoint:ExtensionPointModel>

还需要通过 <cartridge>/staticfiles/cartridge/components 中的组件文件在应用程序类型中注册包含这些扩展的墨盒。这是必需的,以便在正确的应用程序上下文中正确加载扩展。看这个例子:

<?xml version="1.0" encoding="UTF-8" ?>
<components xmlns="http://www.intershop.de/component/2010">
    <fulfill requirement="selectedCartridge" value="your_custom_cartridge" of="intershop.SLDSystem.Cartridges" /> 
    <fulfill requirement="selectedCartridge" value="your_custom_cartridge" of="intershop.B2CBackoffice.Cartridges" />
    <fulfill requirement="selectedCartridge" value="your_custom_cartridge" of="intershop.B2CResponsive.Cartridges" />
</components>

我不太确定您是否需要为所有这些应用程序注册它,但这些是我们在上一个项目中使用的。如果您使用不同的应用程序类型或有自定义应用程序类型,请确保相应地添加它们。

我们最终也通过应用 SMBResponsive 墨盒解决了这个问题。

<?xml version="1.0" encoding="UTF-8"?>
<components xmlns="http://www.intershop.de/component/2010" scope="global">
    <fulfill requirement="selectedCartridge" value="royalihc_sldsystem" of="intershop.SLDSystem.Cartridges"/>
    <fulfill requirement="selectedCartridge" value="royalihc_sldsystem" of="intershop.EnterpriseBackoffice.Cartridges"/>
    <fulfill requirement="selectedCartridge" value="royalihc_sldsystem" of="intershop.SMBResponsive.Cartridges" />
</components>

感谢 Andreas 的所有帮助。