这个问题的主题是我对罪魁祸首的最好猜测,但我不确定我是否相信。总之,我的问题是:我的Sinatra应用程序出了什么问题?
以下是设置:
post '/attachments/go' do …
。我的一个观点中有以下内容:
<form action="/attachments/go" enctype="multipart/form-data" method="post">
<input name="attachments[]" type="file" multiple="multiple">
<button type="submit">upload</button>
</form>
我有两个应用程序在不同端口上运行。
我将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>
以下是症状:
当我直接加载我的应用程序(thin start -e production -p 5142
)时,一切都按预期工作。我可以发布表单并接收文件。这也适用于开发模式。
当我通过反向代理加载我的应用并发布表单时,我收到了404响应:
The requested URL /attachments/go was not found on this server.
我知道继续下去并不多,但是:任何猜测为什么会发生这种情况以及如何解决这个问题?
答案 0 :(得分:1)
像往常一样,发布问题的行为揭示了答案。我有一个由Apache服务的文字/attachments
文件夹,跳过Sinatra代理。然后我命名了一个同名的路线。
这个应用程序和代码已经工作了几年,因此通过升级Sinatra或Rack引入的一些更改必定会导致该错误。 (要么是这个,要么是其他人在我不知情的情况下修改了Apache conf。)
无论罪魁祸首如何,修复都很简单:将路线重命名为:
post '/attachlings/attach' do
…
end
并重写视图以匹配,一切都很好。
课程:不要为具有反向代理跳过的前缀的路由命名。