如何处理 .htaccess 规则中的 & 和 / 等特殊字符


How to handle special characters like & and / in .htaccess rules?

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

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

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

必须对规则进行哪些更改才能使其正常工作?

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

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

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

这意味着:一个或多个字母、数字或破折号。所以没有&%/。因此,您可以将这些添加到方括号中:

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

但是,请记住,在应用任何规则之前,会解码 URI。这意味着如果 URI 如下所示:

/foo%28bar

你不需要匹配%,因为URI被解码为:

/foo(bar

你需要与(比赛.更好的选择可能是只匹配除点之外的所有点:

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

或任何你想要的比赛。


尝试:

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

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

您需要

使用 urlencode 对 URL 编码'ab&cd'这样&就会变成%26.

在此之后,在搜索中.php您需要使用 urldecode 对其进行说明和解码。

像这样做 URL:

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

并围绕这一点编写您的规则。另外,为什么需要 3 个 ID 参数?你不能用第一个来查找另外两个吗?

处理你的网址

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