我想在我的网站上使用花哨的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”?
我想你需要http://httpd.apache.org/docs/current/rewrite/flags.html#flag_b(所以' [L,B]') – Gerben 2012-02-21 21:31:10
好点,但它似乎没有工作。重写日志说:重写'de/source/+ c#' - >'de%2fsource%2f?tags =%2bc%23'然后得到的URL不能被找到。它逃避的方式太多了。只有“#”应该被重新转义,而不是URL路径的所有其他重要部分。 – ygoe 2012-02-21 21:51:17
解决。我需要在页面的目录中创建另一个.htaccess文件以避免所有的“/”转义。您能否将您的评论添加为答案,以便我可以接受它? :) – ygoe 2012-02-21 21:55:31