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