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/上测试了这个,技术上应该可以工作。

在我看来,这个工具看起来不对。(我认为它忽略了PT标志?)

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

400个错误请求"最肯定的是由于使用PT(passthrough)标志与绝对URL。您不应该在这里使用绝对URL(除非您想触发外部重定向或代理请求),并且PT标志在.htaccess上下文中不需要,因为这是默认操作。

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

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

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

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

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

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

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

最新更新