Apache重写会占用一个级别的转义(%23)

时间:2012-02-21 20:39:20

标签: apache mod-rewrite

我想在我的网站上使用花哨的网址标记过滤器。网址应如http://example.com/source/+tag1+tag2。这应该过滤所有标记为tag1和tag2的项目。我想出了以下重写规则,我将其保存到网站的根目录:

RewriteRule ^([^+]+)(\+.+)$ $1?tags=$2 [L]

这适用于所有普通标签名称,但标签名称“c#”失败。我知道哈希字符没有发送到服务器,因此标记名称是url编码的,HTML页面中的链接是这样的:./+c%23但是目标页面只会看到其中的“c”标签参数,其余的和“#”之后的任何东西都不存在了。

我启用了Apache的重写日志记录,发现它已经记录了…/+c#之类的传入URL请求。这让我觉得可能需要另一级别的逃避。所以我尝试使用%2523实际上成功通过了重写,整个字符串“c#”出现在我的页面中。

但话说回来,当我使用内部网址./?tags=c%23访问该网页时,它也已经有效了。那么为什么Apache会吃掉一个级别的逃脱?我可以使用隐藏的重写标志来避免这种情况吗?我是否需要使用双重编码的公共URL才能使用我的花哨网址?或者它太乱了我应该只将我的标签重命名为“csharp”?

1 个答案:

答案 0 :(得分:1)

我认为你需要B flag(所以使用[L,B])