1

我有一个 Django 项目,其中有一个搜索页面,该页面通过 POST 获取输入并重定向到/search/<search string>/,该页面呈现结果。百分号 (%) 在搜索中用作通配符(tes%er 返回 testuser、tester 等,然后 url 看起来像这样:)example.com/search/tes%25er/并且在 Django 开发服务器上一切正常。如果我在 url 中手动写入 tes%er,它会自动更改为 tes%25er。

现在我正在使用 mod_wsgi 在 Apache 服务器上进行部署,当我的搜索页面重定向到example.com/search/tes%er/我收到服务器错误:Bad Request. Your browser sent a request that this server could not understand.. 如果我手动将“25”添加到 url,就像编码的 % 符号一样,它看起来就像开发服务器一样工作正常。

Apache 有没有办法自动转义 %-sign 并创建一个有效的 url,理解 % unscaped 还是我需要在构建 url 的搜索页面中做丑陋的黑客攻击?(我宁愿不做这种丑陋的黑客行为,因为这样用户就不能手动将 % 添加到 url 并让它工作)。

编辑:将查询从搜索页面发送到搜索 url 的代码。

if form.is_valid():
    if 'search_user' in request.POST:
        q = request.POST['search_user']
        return redirect('/search/'+q)
4

1 回答 1

1

正如 Ignacio 已经建议的那样,您不应重定向到无效的 url。所以回答你的问题:

您可以(或者说“应该”更好)不要要求您的 Apache 服务器转义您的 url。您转义 URL 的原因是某些字符具有其他含义。例如,获取一个查询字符串:

somedomain.com/?key=value

如果我们想在您的值中使用 a?或 a=您会遇到问题,因为您的服务器会认为您正在使用查询字符串的运算符。

- 符号也是%如此。当您的 apache 服务器看到一个 %-symbol 时,他认为他会找到一个 enconded 并尝试对其进行解码。如果您的查询字符串是%20,则 apache 会将其转换为空格,而您的意思是“wildcard20”。

总之:apache 解码你的字符串,所以你不希望他编码它。

但这并不能解决您的问题。您可以通过将代码更改为以下内容来解决您的问题:

from urllib import urlencode
if form.is_valid():
    if 'search_user' in request.POST:
        q = request.POST['search_user']
        return redirect('/search/?q='+urlencode(q))

如果您想知道:如果我的用户输入/search/?q=%; 在那种情况下,他会遇到问题,因为他输入了一个无效的地址。

希望这可以帮助 :-)。

伍特

于 2012-05-11T14:14:55.033 回答