【发布时间】:2010-12-25 08:35:47
【问题描述】:
我正在使用 mod_rewrite 将漂亮的 URL 重写为 Spring 2.5 应用程序支持的表单。
e.g. /category/cat1?q=x => /controller?category=cat1&q=x
但是,我想从我的控制器中知道请求来自的原始 URL(这样我可以在需要时生成一个链接)。所有页面都需要这种方法,因此很难进行硬编码。
如何从我的控制器访问原始路径 + 查询字符串?
我尝试使用 $0 来包含完整路径,但这不包含查询字符串。我不能只附加路径和查询字符串,因为这会导致路径的某些部分被添加为参数/category/cat1?category=cat1&q=x 注意添加不需要的&category=cat1 参数,这会导致 URL 不再匹配发送来自浏览器。
我希望 mod_rewrite 能让我引用完整的 URL 并将其编码为参数,这样我的规则就可以如下所示:
RewriteRule /category/(.+)
/controller?category=$1&_originalUrl=${escape:$0}?${escape:<original query string>}
[QSA]
使用我的原始示例,传递给我的控制器的最终结果将是:
/controller?category=cat1&_originalUrl=%2Fcategory%2Fcat1%3Fsearch%3Dx&search=x
重要的部分是&_originalUrl 的值,它应该是%2Fcategory%2Fcat1%3Fsearch%3Dx,在其非转义版本中是/category/cat1?q=x(从浏览器发送的原始请求 URL)。
欢迎任何建议,在此先感谢!
【问题讨论】:
-
我在tools.cherrypy.org/wiki/ModRewrite 发现了一个转义函数 ${escape:$1} 现在我需要弄清楚如何附加路径和原始查询字符串。 ${escape:$0}${escape:}
-
在单独的参数中接收原始路径和查询字符串将是一个合适的解决方案。例如&_originalPath=${escape:$0}&_originalQueryString=${escape:
} 是我不知道如何获取的部分。 -
嗨,有一个类似的问题要解决,但似乎 int:escape 重写映射无法解决问题:它不是 url 编码(比如将 / 变成 %2F,& 到 %26等),只是在 url 中不允许编码字符。我能看到的最后一个选项是使用外部映射程序,但它只会遇到更多麻烦......或者将“;original_qs =
”附加到重写的url
标签: regex apache url mod-rewrite parameters