【问题标题】:Replace %26 in htaccess with %2526将 htaccess 中的 %26 替换为 %2526
【发布时间】:2010-10-22 20:49:08
【问题描述】:

我正在从 Mediawiki 导入一堆标题中带有 & 符号的页面。这些编码为%26。由于各种原因,Drupal 决定对 URL 进行双重编码,使其变为 %2526。我根本无法在 Drupal 中创建别名,所以我必须使用 htaccess。

我需要example.com/something_%26_else 成为example.com/something_%2526_else。到目前为止,这是我的规则:

RewriteRule ^w/([^%26]+)\%26(.*)$ w/$1\%2526$2 [R=301]

感谢您的帮助。

【问题讨论】:

  • 在 htaccess 中还是在 drupal 中?它在 Drupal 中不起作用。
  • 您应该在 Drupal 中解决问题,而不是通过解决它。在 Drupal 处理 URL 中找到该文件,然后重写它。
  • @lekensteyn 我一天中的大部分时间都在尝试做。唯一的解决方案需要拆分多个部分的核心并破坏基于前一种方式构建的大约 1000 个 url。据我所知,Drupal 响应是实时的。
  • 另请参阅,网站管理员堆栈上的相同问题:webmasters.stackexchange.com/questions/11259/…

标签: apache drupal .htaccess mod-rewrite


【解决方案1】:

尝试使用带有RewriteCondNEXT 标志的“look-behind”机制来循环遍历将 %26 更改为 %2526 的 URI:

RewriteCond "\%(?<=25)26"
RewriteRule "^(w/.*)\%(?<=25)(26.*)" "$1\%25$2" [N]

【讨论】:

  • 您的示例中不需要后视断言。它永远无法匹配,因为前一个字符始终是 %
  • 不,它并不总是%。这才是重点;这不是两个编码字符,而是一个编码已损坏的字符。
  • 我说的是你的正则表达式,而不是输入。它以% 开头,因此它必须匹配该字符,因此当它在下一个字符后面查找时,它永远不会是5
  • 我同意@Walf,正则表达式\%(?&lt;=25) 永远不会匹配任何东西(\%(?&lt;=25\%) 可能匹配something,但错误的something)。 (我想知道您是否打算使用负前瞻以避免匹配 %2526,但这似乎也没有必要?)但是,这些指令还有其他问题:RewriteCond 指令缺少 TestString 参数和 RewriteRule pattern 匹配的 URL 路径已经被 % 解码,所以文字 %26 无论如何都不会在这里匹配。
【解决方案2】:

要将/&lt;something&gt;%26&lt;something&gt;请求 重定向到/&lt;something&gt;%2526&lt;something&gt;,那么您可以使用 mod_rewrite 执行以下操作:

RewriteRule (.+)&(.+) /$1\%26$2 [R,L]

RewriteRule 模式 匹配 %-decoded URL 路径(即&amp;,而不是%26)。所以你应该简单地从字面上指定&amp;(与号)。请注意,这将匹配/something_%26_else/something_&amp;_else 的请求(因为&amp; 不需要在请求中编码)。

RewriteRule 中的 %(百分比)替换 需要反斜杠转义以表示文字 %,否则将被视为对最后匹配的CondPattern,并且没有,所以%2否则会变成一个空字符串!

默认情况下,mod_rewrite 自动对替换 URL 进行 URL 编码,这实际上是我们在本例中想要的:%26 被(双重)编码为 %2526


如果您特别需要循环结构,例如 %26 可以在请求的 URL 中出现多次,那么您可以执行以下操作:

# 1. Looping construct to replace all "&" (decoded %26)
RewriteRule (.+)&(.+) $1\%26$2 [N,E=REPLACED:yes]

# 2. Finally redirect. Substitution is only URL-encoded at this stage.
RewriteCond %{ENV:REPLACED} yes
RewriteRule (.*) /$1 [R,L]

有关更多解释和替代方法,另请参阅我对 Pro Webmasters stack 上同一问题的回答:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多