2012-02-21 72 views
1

我想在我的网站上使用花哨的URL作为标记过滤器。网址应该看起来像http://example.com/source/+tag1+tag2。这应该筛选标签tag1和tag2的所有项目。我想出了,下面的重写规则,这是我保存在站点的根目录:Apache重写吃掉了一个级别的转义(%23)

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

也能正常工作的所有普通的标签名字,但它失败的标签名称为“C#”。我知道散列字符不会发送到服务器,因此标记名称是url编码的,HTML页面中的链接如下所示:./+c%23但目标页面只能在其tags参数中看到“c”,休息和“#”之后的任何东西都不在了。

我已启用Apache的重写日志记录,并看到它已记录传入的URL请求,如…/+c#。这使我认为可能需要另一级别的转义。所以我尝试了%2523,它实际上已经成功地通过了重写,而整个字符串“c#”出现在我的页面中。

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

+0

我想你需要http://httpd.apache.org/docs/current/rewrite/flags.html#flag_b(所以' [L,B]') – Gerben 2012-02-21 21:31:10

+0

好点,但它似乎没有工作。重写日志说:重写'de/source/+ c#' - >'de%2fsource%2f?tags =%2bc%23'然后得到的URL不能被找到。它逃避的方式太多了。只有“#”应该被重新转义,而不是URL路径的所有其他重要部分。 – ygoe 2012-02-21 21:51:17

+0

解决。我需要在页面的目录中创建另一个.htaccess文件以避免所有的“/”转义。您能否将您的评论添加为答案,以便我可以接受它? :) – ygoe 2012-02-21 21:55:31

回答

1

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

+1

这确实是我正在寻找的选项。但它会在重写过程中转义整个URL字符串,包括路径分隔符(/)和我用于标记名称分隔的加号字符(+)。由于其中存在%2F的文件(转义为/)不存在,因此我需要将.htaccess文件的该部分移动到目标页面所在的目录中。然后我可以使用我上面的重写规则,只有[L,B]前缀。 – ygoe 2012-02-21 22:08:29