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

标签 apache .htaccess mod-rewrite aem dispatcher

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

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/

相关文章:

php - 重写index.php最佳实践

regex - htaccess 重写不同的目录

.htaccess - URL/子域重写(htaccess)

php - OSX Mavericks - 使用子域设置 Apache

apache - 在 Apache 反向代理后面使用 SSL 的 JIRA 服务器无法正常工作

apache - RewriteBase 的值可用作变量/引用吗?

apache - http 到 https 给出重定向循环错误

apache - 为什么我的 CSS/JS 资源使用 HTTPS 加载?

java - 具有编程身份验证的 SVN 服务器

php - HTTP 内容类型响应中的错误字符集