在Apache后面反向代理时丢失路由?

时间:2013-06-12 04:14:33

标签: ruby apache sinatra thin

这个问题的主题是我对罪魁祸首的最好猜测,但我不确定我是否相信。总之,我的问题是:我的Sinatra应用程序出了什么问题?

以下是设置:

  1. 我的一条路线中有post '/attachments/go' do …
  2. 我的一个观点中有以下内容:

    <form action="/attachments/go" enctype="multipart/form-data" method="post">
      <input name="attachments[]" type="file" multiple="multiple">
      <button type="submit">upload</button>
    </form>
    
  3. 我有两个应用程序在不同端口上运行。

  4. 我将Apache设置为反向代理:

    …
    <Proxy balancer://myapp/>
      BalancerMember http://127.0.0.1:3006
      BalancerMember http://127.0.0.1:3007
      ProxySet lbmethod=bybusyness
    </Proxy>
    …
    <VirtualHost *:80>
      ServerName myapp.mycompany.com
      ServerAlias myapp
      DocumentRoot "C:/www/myapp/public"
    
      ProxyPass /css !
      ProxyPass /js !
      ProxyPass /images !
      ProxyPass /attachments !
    
      ProxyPass        / balancer://myapp/
      ProxyPassReverse / balancer://myapp/
    </VirtualHost>
    
  5. 以下是症状:

    1. 当我直接加载我的应用程序(thin start -e production -p 5142)时,一切都按预期工作。我可以发布表单并接收文件。这也适用于开发模式。

    2. 当我通过反向代理加载我的应用并发布表单时,我收到了404响应:

      The requested URL /attachments/go was not found on this server.
      
    3. 我知道继续下去并不多,但是:任何猜测为什么会发生这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

像往常一样,发布问题的行为揭示了答案。我有一个由Apache服务的文字/attachments文件夹,跳过Sinatra代理。然后我命名了一个同名的路线。

这个应用程序和代码已经工作了几年,因此通过升级Sinatra或Rack引入的一些更改必定会导致该错误。 (要么是这个,要么是其他人在我不知情的情况下修改了Apache conf。)

无论罪魁祸首如何,修复都很简单:将路线重命名为:

post '/attachlings/attach' do
  …
end

并重写视图以匹配,一切都很好。

课程:不要为具有反向代理跳过的前缀的路由命名。