Azure Linux Web App部署后URL中%2F被自动解码触发404错误如何解决
前提确认
web.config是Windows IIS服务专属的配置文件,Azure Linux Web App运行环境不使用IIS,因此该配置文件确实不生效,之前的相关修改尝试无法解决问题。
问题根本原因
Azure Linux Web App默认使用Nginx作为前置反向代理,Nginx默认会自动解码URL路径中的百分号编码字符,其中%2F会被解码为/,导致原本是单段路径参数的内容被拆分为多级路径,Rails路由无法匹配返回404。你之前使用的AWS Elastic Beanstalk环境的反向代理默认未开启URL路径自动解码,因此功能正常。
可行解决方案
你可以根据自己的业务场景选择以下任意一种方案:
方案1:修改Azure Web App的Nginx默认配置(推荐,从根源修复)
- 在Rails项目根目录创建自定义Nginx配置文件
nginx.conf,在配置的server块中调整转发规则,使用原始未解码的$request_uri代替默认解码后的$uri进行转发,示例配置片段如下:
server { listen 80; server_name _; # 关闭自动合并斜杠,避免多余路径处理 merge_slashes off; location / { # 此处替换为你Rails服务的实际监听地址和端口 proxy_pass http://127.0.0.1:3000$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 在Azure Web App的配置-常规设置中,修改启动命令,指定加载你的自定义Nginx配置,示例启动命令参考(根据你实际的运行环境调整路径):
cp /home/site/wwwroot/nginx.conf /etc/nginx/sites-available/default && service nginx restart && bundle exec puma -C config/puma.rb
方案2:Rails路由层兼容处理
如果不想修改服务端代理配置,可以直接调整Rails路由规则,匹配被拆分后的路径:
- 打开
config/routes.rb,添加对应路由的通配符匹配规则:
# 替换为你实际的控制器和动作名称,constraints配置允许path参数包含斜杠 get '/link/*path', to: 'links#show', constraints: { path: /.*/ }
- 在对应控制器中获取拼接后的path参数即可:
def show # 此处获取到的就是完整的asd/asw参数,你可以根据业务需要自行编码或直接使用 raw_path = params[:path] end
验证方法
部署修改后的代码/配置后,访问测试链接www.website.com/link/asd%2Fasw,查看Rails日志中收到的请求路径是否符合预期,确认接口可以正常返回内容即可。
内容的提问来源于stack exchange,提问作者yellowskull
相关产品推荐
相关产品推荐

