AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1083215
Accepted
alancc
alancc
Asked: 2021-11-11 22:09:17 +0800 CST2021-11-11 22:09:17 +0800 CST 2021-11-11 22:09:17 +0800 CST

我应该在 RewriteCond 中转义斜杠“/”吗?

  • 772

我是否需要在 RewriteCond 中转义斜杠“/”?

目前我在.htaccess中写了以下规则:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.datanumen.com/knowledgebase/ [QSD,R=301,L,NC]

但是,这仅适用于https://www.datanumen.com/fi/customer/index.php?rp=/knowledgebase/7/How-to-order-the-full-version-of-DataNumen-Access之类的 URL -Repair.html&language=swedish,但不适用于https://www.datanumen.com/fi/customer/index.php?rp=%2Fknowledgebase%2F7%2FHow-to-order-the-full-version-之类的 URL of-DataNumen-Access-Repair.html&language=swedish

所以,我必须修改规则,如下所示:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/ [OR]
RewriteCond %{QUERY_STRING} rp=%2Fknowledgebase%2F
RewriteRule ^index\.php$ https://www.datanumen.com/knowledgebase/ [QSD,R=301,L,NC]

但是我检查了https://serverfault.com/a/968916/280923并说“不需要转义斜杠(/) ”。所以我很困惑。

如果我需要考虑所有情况,即'/'的转义版本和非转义版本,那么应该总共有4种组合,我应该将它们全部添加为RewriteCond:

rp=/knowledgebase/
rp=%2Fknowledgebase%2F
rp=%2Fknowledgebase/
rp=/knowledgebase%2F
.htaccess mod-rewrite rewritecond
  • 1 1 个回答
  • 1049 Views

1 个回答

  • Voted
  1. Best Answer
    MrWhite
    2021-11-12T07:00:17+08:002021-11-12T07:00:17+08:00

    我应该逃避斜线/吗RewriteCond?

    通过“转义斜杠”,您的真正意思是“我应该匹配 URL 编码的斜杠吗?”。这完全取决于向您的服务器发出的 HTTP 请求。

    但是我检查了https://serverfault.com/a/968916/280923,它说“/不需要转义斜杠 ( )”。所以我很困惑。

    链接的问题/答案与当前问题无关。该问题是处理 Apache 指令/正则表达式中的反斜杠转义,而不是您在此处处理的 URL 编码(或 % 编码)URL。这是用于不同目的的两种非常不同类型的“转义”方法。

    您正在处理的是 % 编码的 URL。URL 在 HTTP 请求中的显示方式。URL 的不同部分(特别是“路径”和“查询字符串”)具有不同的编码要求。是否需要对特定字符进行 % 编码取决于它在该上下文中是否具有特殊含义。

    正如RFC3986中定义的那样,斜杠 ( /) 并不严格需要在 URL 的查询字符串部分进行 % 编码。但是,URL 编码函数(例如 PHP 和 JavaScript)通常会对该字符进行 %-encode。(我认为这在很大程度上是历史性的,因为据报道一些旧的实现没有正确处理未编码的斜线 - 参考RFC3986。)

    但是,无论一个字符是否需要进行 URL 编码(以否定其特殊含义),任何字符都可以进行 % 编码,这应该与文字(未编码)字符一样对待。

    您是否需要匹配/(解码)或%2F(编码)取决于该字符是否在请求中进行了 % 编码。

    您的问题是QUERY_STRINGserver 变量没有 %-decoded,这与RewriteRule pattern匹配的 URL-path 不同。

    但是......你需要检查 %-decoded/和 % -encoded%2F吗?大概您始终只链接到一个或另一个(规范)URL。因此,对非规范 URL 的任何请求都必须由第三方手动输入或错误链接。您是否收到对两者的请求?不重定向非规范 URL 的后果是什么?

    否则,是的,您需要检查两者(以及可能的所有变体/案例)。尽管这可能只是/knowledgebase/或%2Fknowledgebase%2F。但请注意,它可能是%2F(大写)或%2f(小写)。大写只是一个约定。必须检查混合编码,例如%2Fknowledgebase/应该非常罕见。但这也与%2f%6b%6e%6f%77%6c%65%64%67%65%62%61%73%65%2f. 您是否需要处理所有这些变化取决于获得此类请求的可能性以及规则不匹配的严重性。

    因此,要同时匹配/knowledgebase/和%2Fknowledgebase%2F(不区分大小写),您可以使用以下内容:

    RewriteCond %{QUERY_STRING} ^rp=(/|%2[Ff])knowledgebase(/|%2[Ff])
    

    您可以避免使用字符类[Ff]并使用NC标志来使整个比较不区分大小写。例如:

    RewriteCond %{QUERY_STRING} ^rp=(/|%2F)knowledgebase(/|%2F) [NC]
    

    在 Apache 2.4 上,您可以unescape()在 Apache 表达式中使用该函数与指令在进行比较之前RewriteCond对 URL 进行解码。QUERY_STRING但是,这并不能真正帮助您,因为它不会 %-decode 斜杠,即。%2F或%2f根据请求保留(但任何其他字符都被 % 解码)。例如:

    RewriteCond expr "unescape(%{QUERY_STRING}) =~ m#^rp=(/|%2[Ff])knowledgebase(/|%2[Ff])#"
    

    这将允许您匹配rp=%2f%6b%6e%6f%77%6c%65%64%67%65%62%61%73%65%2f.


    或者,如果您不希望查询字符串中有任何 URL 编码字符,那么您可以简单地阻止任何发送任何请求的请求!例如,以下内容需要放在配置的顶部:

    # Block any request that includes a %-encoded character in the query string
    RewriteCond %{QUERY_STRING} %[\da-f]{2} [NC]
    RewriteRule ^ - [R=400]
    
    • 1

相关问题

  • apache重写以将文件夹分配给域

  • Apache conf 或 .htaccess 规则将 404 重定向到特定文件类型的另一个位置

  • 如何让 Apache2 重定向到子目录

  • .htaccess - 删除所有 cookie

  • 我的 .htaccess 文件是什么意思?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve