【问题标题】:How to handle special characters like & and / in .htaccess rules?如何处理 .htaccess 规则中的 & 和 / 等特殊字符?
【发布时间】:2013-09-09 14:45:50
【问题描述】:

在我的 .htaccess 文件中,我定义了以下规则,

RewriteRule ^([-0-9a-zA-Z]+) search.php?id=$1

如果我正在浏览http://example.com/abcd,上述规则可以正常工作 我需要在网址中使用符号& % - /,例如:http://example.com/ab&cd

必须对规则进行哪些更改才能使其生效?

【问题讨论】:

  • 实际网址是http://example.com/ab&cd?看起来很奇怪。
  • 我需要该 URL 在其 /AT%26T 或即使其 /AT&T 时工作

标签: php regex .htaccess mod-rewrite


【解决方案1】:

使用你的网址

RewriteRule ^directory/([^/.]+)$ /searchpage.php?search_keywords=$1  [L]

【讨论】:

    【解决方案2】:

    不知道该规则如何为您工作。首先,它循环。其次,$2$3 没有捕获组,但这并不重要,因为无论如何$1 总是“搜索”。我假设您已经粘贴了您拥有的有效规则的部分 sn-p。

    &%/ 不匹配的原因是因为您的正则表达式说:

    [-0-9a-zA-Z]+
    

    表示:一个或多个字母、数字或破折号。所以没有&%/。所以你可以将它们添加到方括号中:

    RewriteRule ^([-0-9a-zA-Z/%&]+) search.php?id=$1&ff=$2&ffid=$3
    

    但是,请记住,在应用任何规则之前,URI 已被解码。这意味着如果 URI 看起来像:

    /foo%28bar
    

    您无需匹配%,因为 URI 被解码为:

    /foo(bar
    

    你需要匹配(。更好的选择可能是匹配每个 except 点:

    RewriteRule ^([^.]+) search.php?id=$1&ff=$2&ffid=$3
    

    或者你在比赛中想要的任何东西。


    试试:

    RewriteRule ^([^.]+)$ search.php?id=$1 [B]
    

    这里的区别在于 $ 将匹配绑定到 URI 的末尾,而 B 标志确保 & 被编码。

    【讨论】:

    • 对不起,规则中最后两个ID参数,这里没有用到。我尝试了上面提到的两个规则,但是,如果 url 是 /AT%26T/AT&T,则 search.php 文件中只会收到 AT
    • 有同样的问题我已经使用了答案解决方案,但它在我的应用程序上不起作用,这是实际链接的想法(m.host/web/sref.php?page=1&refone=1&reftow=%)............使用后.htaccess 它会像------(m.host/web/sref/1/1/%) 但它不工作
    • @abas_rafiq 尝试将其作为问题发布,因为您无法在 cmets 中格式化任何内容
    • @jon lin ,这是我的问题
    【解决方案3】:

    网址如下:

    http://example.com/id/ff/ffid
    

    然后写下你的规则。另外,为什么需要 3 个 ID 参数?你不能用第一个查找另外两个吗?

    【讨论】:

    • 抱歉,这里不需要最后两个参数。我已将它们从问题中删除。
    • 重写规则 ^([-0-9a-zA-Z]+)\/? search.php?id=$1 [L]
    【解决方案4】:

    您需要使用urlencode'ab&cd' 进行URL 编码 这样& 就变成了%26

    之后,在 search.php 中,您需要使用 urldecode 对其进行解释和解码。

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2023-03-11
      • 2014-12-31
      • 2010-11-19
      相关资源
      最近更新 更多