我正在尝试使我的产品详细信息页面具有以下格式:
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]
最佳答案
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 Bad Request”肯定是由于使用 PT
带有绝对 URL 的 (passthrough) 标志。您不应在此处使用绝对 URL(除非您想触发外部重定向或代理请求)和 PT
那么 .htaccess
中不需要标志。上下文,因为这是默认操作。
正则表达式的尾部部分([^?]*)(/?)$
,可以说是不正确的。看起来您正在尝试从第一个捕获的子模式中省略可选的尾部斜杠。然而,这不是这个正则表达式的作用。由于前面的量词 ( *
) 是贪婪的,这也会消耗可选的尾部斜杠,因此 /?
接下来的内容实际上并没有做任何事情。正则表达式 ([^?]*)(/?)$
与 ([^?]*)$
相同。 (URL 路径中也不可能有 % 编码的 ?
,因此这可能与 (.*)
相同。)如果您想排除捕获可选的尾部斜杠,则需要使前面的模式是非贪婪的,因此它不会消耗可选尾部斜杠。例如。 ([^?]*?)/?$
(最后的捕获组似乎是多余的)。或者,使用交替,例如。 ([^?]*)(?:/|)$
。或者,使前面的模式更具限制性,这样它就不会匹配斜杠。例如。 ^([\w-]*)/?$
。 (旁注:此处将尾部斜杠设为可选,可能会造成重复内容问题。)
您也不需要 RewriteCond
指令,因为可以在 RewriteRule
中执行此检查(更有效) 模式。
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
中这些指令的顺序也很重要。想必您在文件后面有一个前端 Controller 模式来路由请求?
关于apache - AEM 6.3 : Bad Request when replacing dot in selector for slash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66229547/