AEM 6.3:将选择器中的点替换为斜线时出现错误请求

问题描述

我正在尝试使我的产品详细信息页面具有以下格式:

https://stage.aemsite.com/en/product-details/some-product

我们将选择器用于我们的产品详细信息,所以我知道 AEM 将无法解释这一点,我的想法是使用调度程序允许传递到正确的格式 https://stage.aemsite.com/en/product-details.some-product,但这会导致错误的请求。

我在 https://technicalseo.com/tools/htaccess/ 上对此进行了测试,技术上应该可行。

RewriteCond %{REQUEST_URI} ^/([a-z]{2})/product-details/([^?]*)(/?)$
RewriteRule ^ https://%{SERVER_NAME}/%1/product-details.%2 [PT,L,NC]

有什么想法吗?

编辑:根据正确答案,这是对我有用的格式,原因是 AEM 需要路径作为内容树中资源的路径。

RewriteRule ^([a-z]{2})/product-details/([^?]*?)/?$ https://%{SERVER_NAME}/content/marketplace/$1/product-details.$2 [L]

解决方法

我在 https://technicalseo.com/tools/htaccess/ 上对此进行了测试,技术上应该可行。

FWIW,该工具在 IMO 看来是错误的。 (我认为它忽略了 PT 标志?)

RewriteCond %{REQUEST_URI} ^/([a-z]{2})/product-details/([^?]*)(/?)$
RewriteRule ^ https://%{SERVER_NAME}/%1/product-details.%2 [PT,L,NC]

“400 错误请求”肯定是由于使用了带有绝对 URL 的 PT(直通)标志。您不应在此处使用绝对 URL(除非您想触发外部重定向或代理请求),因此 PT 上下文中不需要 .htaccess 标志,因为这是默认操作.

正则表达式 ([^?]*)(/?)$ 的结尾部分可以说是不正确的。看起来您试图从第一个捕获的子模式中省略可选的尾部斜杠。然而,这不是这个正则表达式的作用。因为前面的量词 (*) 是贪婪的,这也会消耗可选的尾部斜杠,所以后面的 /? 实际上不会做任何事情。正则表达式 ([^?]*)(/?)$([^?]*)$ 相同。 (您也不太可能在 URL 路径中使用 % 编码的 ?,因此这可能与 (.*) 相同。)如果您想从捕获中排除可选的尾部斜杠,您可以需要使前面的模式非贪婪,以便它不消耗 optional 尾部斜杠。例如。 ([^?]*?)/?$(最后的捕获组似乎是多余的)。或者,使用 alternation,例如。 ([^?]*)(?:/|)$。或者,使前面的模式更具限制性,因此它不会匹配斜杠。例如。 ^([\w-]*)/?$。 (旁注:此处将尾部斜杠设为可选,可能会造成重复的内容问题。)

您也不需要 RewriteCond 指令,因为可以在 RewriteRule pattern 中(更有效地)执行此检查。

NC 上的 RewriteRule 标志无论如何都不适用于条件,因此该标志在您发布的规则中是多余的。然而,它只会促进重复的内容。

因此,考虑以上几点将导致以下结果:

RewriteRule ^([a-z]{2})/product-details/([^?]*?)/?$ $1/product-details.$2 [L]

然而,这是否适用于 AEM(或任何 CMS)是另一回事,因为 AEM 可能只“看到”包含斜杠的请求 URL。包含点的重写 URL 大多对后端脚本隐藏,除非它是预期的并且知道在哪里查看。当 URL 像这样重写时,Apache 将 REDIRECT_URL 服务器变量设置为重写后的 URL,但 CMS 不太可能检查这一点,因为它不一定是被请求的 URL。

这些指令在 .htaccess 中的顺序也很重要。据推测,您稍后在路由请求的文件中有一个前端控制器模式?