Apache AEM 6.3:替换斜杠选择器中的点时请求错误

Apache AEM 6.3:替换斜杠选择器中的点时请求错误,apache,.htaccess,mod-rewrite,aem,dispatcher,Apache,.htaccess,Mod Rewrite,Aem,Dispatcher,我正在尝试使我的产品详细信息页面具有以下格式: https://stage.aemsite.com/en/product-details/some-product 我们在产品详细信息中使用选择器,因此我知道AEM无法解释这一点,我的想法是使用dispatcher允许传递到正确的格式https://stage.aemsite.com/en/product-details.some-product,但这会导致错误的请求 我测试了这个,从技术上来说应该是可行的 RewriteCond %{REQUE

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

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

我测试了这个,从技术上来说应该是可行的

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/
,从技术上讲,它应该可以工作

RewriteCond %{REQUEST_URI} ^/([a-z]{2})/product-details/([^?]*)(/?)$
RewriteRule ^ https://%{SERVER_NAME}/%1/product-details.%2 [PT,L,NC]
FWIW,该工具在我看来是错误的。(我认为它忽略了
PT
标志?)

“400错误请求”最明显的原因是使用带有绝对URL的
PT
(passthrough)标志。此处不应使用绝对URL(除非您希望触发外部重定向或代理请求),并且
.htaccess
上下文中不需要
PT
标志,因为这是默认操作

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

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

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

因此,考虑到上述几点,将产生以下结果:

RewriteRule ^([a-z]{2})/product-details/([^?]*?)/?$ $1/product-details.$2 [L]
然而,这是否适用于AEM(或任何CMS)则是另一回事,因为AEM可能只“看到”包含斜杠的请求URL。重写后的包含点的URL大部分是隐藏在后端脚本中的,除非它是预期的,并且知道在哪里查找。当URL像这样重写时,Apache将
REDIRECT\u URL
服务器变量设置为重写的URL,但是CMS不太可能检查这一点,因为它不一定是被请求的URL


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

您能提到url
https://stage.aemsite.com/en/product-details.some-product
应该由后端中的哪个文件或url提供服务?请澄清一下once.AEM有一个dispatcher文件(stage.conf),我在该文件中编写了直通规则,这有帮助吗?至于架构,AEM基于吊索模型,感谢您的深入解释!我设法访问了dispatcher的日志,发现了以下错误:[core:error][pid 20651:tid 139675540870912][client 10.73.0.60:44460]AH00126:request GET/en/product details/some product HTTP/1.1中的URI无效。我想AEM希望URL是相对的,我的页面实际上位于/content/mysite/en/product details中。一些product.htmlI会根据您令人惊讶的解释用正确的重写来更新我的问题。谢谢不客气。该“错误”似乎是与“400错误请求”相关联的Apache错误。声明的“URL”是初始请求上主机头的内容,而不是被重写的URI,这可能是导致错误的原因。“正确的重写”-但您发布的指令可能会导致302外部重定向(因此只需将URL更改回)?我最终使用此命令来阻止302,而是将格式化的URL保留在浏览器上:RewriteRule^/([a-z]{2})/product details/([^?]*?)/?$/content/marketplace/$1/product details.$2.html[PT,L]这满足所有要求:)如果在
.htaccess
中,则不需要
PT
标志。