Apache mod_rewrite 删除问号(?)和查询字符串替换

Apache mod_rewrite 删除问号(?)和查询字符串替换

我使用 mod_rewrite 注册了一个 RewriteRule,但是替换的 URL 是错误的。

规则是:

RewriteRule ^/img/z(0|1)u(.+)\.(gif|jpg|jpeg|png)$ /image-servlet/img/?z=$1&url=$2 [NE,QSA,PT,T=image/$3]

当我访问以下 URL 时:

http://localhost/img/z1uABC.jpg

应用的规则重定向到:

http://localhost/image-servlet/img/ABC

最终的 URL 缺少查询字符串替换:

?z=$1&url=$2

并替换为:

$2

有人能帮助我纠正我的错误吗?

感谢,

过去

答案1

我知道这很丑陋,甚至效率更低,但是你尝试过吗:

重写规则 ^/img/z(.+)u(.+)\.(.+)$ /image-servlet/img/?z=$1&url=$2 [NE,QSA,PT,T=image/$3]

我似乎记得 mod_rewrite 只会将 (.+) 或 (.*) 与变量匹配。显然(从您的示例来看),这是唯一正确重写的内容。

当然,mod_rewrite 规则将永远匹配,并要求脚本进行一些输入验证。

此外,apache 支持 TRACE http 命令,该命令非常适合追踪多次(意外)重写。只需将 http 请求中的 GET 替换为 TRACE,例如:

跟踪/z1uABC.jpg HTTP/1.1

主机:foohost.com

最后,如果您仍然遇到问题,请尝试运行 LiveHeader 或 Firebug Firefox 扩展。

答案2

您还可以设置重写日志和 RewriteLogLevel 看看是否有帮助

答案3

尝试从你的标志中删除 QSA;在你的例子中,你是不是呈现初始查询字符串 -- QSA 和替换中的 ? 会将它们组合起来,这不是您的模式所规定的;这可能是搞砸事情的原因。考虑到您的模式输入,使用 NE 也是没必要的,但它不应该造成问题。我认为您真的只需要 [PT,T=image/$3]。

答案4

您还可以向我们展示 httpd.conf 中的 mod_jk 配置吗?我不明白为什么需要 Alias 指令。

相关内容