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

AEM 6.3: Bad Request when replacing dot in selector for slash

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

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//product-details. [L]

I tested this on https://technicalseo.com/tools/htaccess/ and it should technically work.

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

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

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

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

您也不需要 RewriteCond 指令,因为可以在 RewriteRule 模式 .[= 中执行此检查(更有效) 35=]

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

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

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

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

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