Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 如何在部署到子URI的Sinatra应用程序中处理表单?_Apache_Deployment_Sinatra_Passenger - Fatal编程技术网

Apache 如何在部署到子URI的Sinatra应用程序中处理表单?

Apache 如何在部署到子URI的Sinatra应用程序中处理表单?,apache,deployment,sinatra,passenger,Apache,Deployment,Sinatra,Passenger,可能是个新手问题。我正试图通过Passenger和Apache部署Sinatra应用程序。当应用程序部署在VirtualHost根目录下时,它可以完美地工作,但当我尝试将表单post部署到子URI时,它无法正确处理表单post 该应用程序的简化版本如下: test-app.rb: require 'sinatra/base' require 'haml' class TestApp < Sinatra::Base get '/' do haml :ask end

可能是个新手问题。我正试图通过Passenger和Apache部署Sinatra应用程序。当应用程序部署在VirtualHost根目录下时,它可以完美地工作,但当我尝试将表单post部署到子URI时,它无法正确处理表单post

该应用程序的简化版本如下:

test-app.rb:

require 'sinatra/base'
require 'haml'

class TestApp < Sinatra::Base

  get '/' do
    haml :ask
  end

  post '/submit' do
    if params[:test_string].nil? || params[:test_string].empty?
      redirect '/'
    end

    @test_string = params[:test_string]
    haml :result
  end
end
ask.haml:

%form{:action => '/submit', :method => 'post'}
  %legend
    Get a string
  %p
    %label{:for => ''} Please enter a string:
    %input{:type => 'textbox', :name => 'test_string', :id => 'test_string'}
  %p
    %input{:type => 'submit', :value => 'Submit >>>'}
%form{:action => "#{ url('/submit') }", :method => 'post'}
  %legend
    Get a string
  %p
    %label{:for => ''} Please enter a string:
    %input{:type => 'textbox', :name => 'test_string', :id => 'test_string'}
  %p
    %input{:type => 'submit', :value => 'Submit >>>'}
结果:haml:

%p== Here's your string: #{ @test_string }
可能出现的情况是表单POST没有指向正确的URI——它似乎忽略了子URI配置,而指向VirtualHost根目录,其中当然没有处理路由的代码。我已经反复检查了Apache配置,这似乎不是问题所在

<VirtualHost *:80>
  ServerName my.domain.com
  DocumentRoot /var/websites/home
  <Directory /var/websites/home>
    Allow from all
    Options -MultiViews
  </Directory>

  Alias /test-app /var/websites/test-app/public
  <Location /test-app>
    PassengerBaseURI /test-app
    PassengerAppRoot /var/websites/test-app
  </Location>
  <Directory /var/websites/test-app/public>
    Allow from all
    Options -MultiViews
  </Directory>
</VirtualHost>

ServerName my.domain.com
DocumentRoot/var/websites/home
通融
选项-多视图
别名/test-app/var/websites/test-app/public
PassengerBaseURI/测试应用程序
Passengeraprot/var/网站/测试应用程序
通融
选项-多视图

是否有任何方法(除了对表单进行硬编码)来确保表单发布到我的应用程序可以处理它的子URI,而不是发布到VirtualHost根目录?

不确定这是处理此问题的最佳方法,但我通过在ask.haml中使用Sinatra的url帮助程序解决了此问题:

%form{:action => "#{ url('/submit') }", :method => 'post'}
  %legend
    Get a string
  %p
    %label{:for => ''} Please enter a string:
    %input{:type => 'textbox', :name => 'test_string', :id => 'test_string'}
  %p
    %input{:type => 'submit', :value => 'Submit >>>'}
通过这样做,我的表单将发布到应用程序的子URI,而不是VirtualHost根目录