繁体   English   中英

使用Apache正确转义URL中的%

[英]Correct escaping of % in the URL with Apache

我有一个Django项目,其中有一个搜索页面,该页面通过POST接收输入并重定向到/search/<search string>/并且此页面呈现结果。 百分号(%)在搜索中用作通配符(tes%er返回testuser,tester等,然后url如下所示: example.com/search/tes%25er/ ),并且一切都可以在Django上正常运行开发服务器。 如果我在网址中手动写入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. Bad Request. Your browser sent a request that this server could not understand. 如果我在网址中手动添加“ 25”(如编码的%符号),则它看起来像开发服务器一样,可以正常工作。

Apache是​​否有一种方法可以自动转义%符号并创建可以正常工作的url,了解未转义的%,或者我需要在构建该URL的搜索页面中进行难看的修改? (我不想像这样造成丑陋的骇客,然后用户无法将%手动添加到url并使其正常工作)。

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

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

正如Ignacio所建议的那样,您不应重定向到无效的URL。 因此,回答您的问题:

您可以(或者最好说“应该”)不要求您的Apache服务器转义您的URL。 逃脱URL的原因是因为某些字符还有其他含义。 例如,使用一个查询字符串:

somedomain.com/?key=value

如果我们想使用? =值,则可能会出现问题,因为服务器会认为您正在使用查询字符串的运算符。

%符号相同。 当您的apache服务器看到%符号时,他认为他会找到一个encond并将尝试对其进行解码。 如果您的查询字符串是%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=% ,该/search/?q=% 在这种情况下,他会遇到问题,因为他输入了无效的地址。

希望这可以帮助 :-)。

Wout

正确

[英]Correct <form action=“ ” URL for a SessionWizardView

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM