You need to enable JavaScript to run this app. Azure Linux Web App部署后URL中%2F被自动解码触发404错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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默认配置(推荐,从根源修复)

  1. 在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;
    }
}
  1. 在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路由规则,匹配被拆分后的路径:

  1. 打开config/routes.rb,添加对应路由的通配符匹配规则:
# 替换为你实际的控制器和动作名称,constraints配置允许path参数包含斜杠
get '/link/*path', to: 'links#show', constraints: { path: /.*/ }
  1. 在对应控制器中获取拼接后的path参数即可:
def show
  # 此处获取到的就是完整的asd/asw参数,你可以根据业务需要自行编码或直接使用
  raw_path = params[:path]
end
验证方法

部署修改后的代码/配置后,访问测试链接www.website.com/link/asd%2Fasw,查看Rails日志中收到的请求路径是否符合预期,确认接口可以正常返回内容即可。

内容的提问来源于stack exchange,提问作者yellowskull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 16:45:04