Ajax Apache + Passenger 集成模式调用触发库URL

Ajax call triggering base URL in Apache + Passenger integration mode

我正在尝试通过 httpd 配置文件配置多个 RAILS 应用程序。一切正常,但 AJAX 调用触发了错误的 URL,例如,如果应用程序配置为 http://localhost/helloapp/ 它有 AJAX 调用 get "/say_hello" 它正在尝试获取 "localhost/say_hello" 而不是 "localhost/helloapp/say_hello"。 下面是我位于 '/etc/httpd/conf/httpd.conf 的 httpd 配置文件 '.我正在使用 centOS。

<VirtualHost *:80>
 ServerName localhost
    <Directory /var/www/html >
        Allow from all
        Options -MultiViews
        # Uncomment this if you're on Apache >= 2.4:
        #Require all granted
    </Directory>
   Alias /helloapp /var/www/html/hello_application/public
    <Location /helloapp>
        PassengerBaseURI /helloapp
        PassengerAppRoot /var/www/html/hello_application
    </Location>
    <Directory /var/www/html/hello_application/public>
      # MultiViews must be turned off.
        Allow from all
        Options -MultiViews
    </Directory>
</VirtualHost>

任何时候您向 url 发出以 / 开头的 HTTP 请求,例如 /say_hello,这意味着您正在向您指定的路径发送请求根 URL。根 URL 始终是您的域,在您的情况下是 http://localhost/.

因此,无论您如何配置 Apache 服务器,当您向 /say_hello 发出请求时,您的浏览器都会将其定向到 http://localhost/say_hello。如果您想向 http://localhost/helloapp/say_hello 发出请求,则必须在您的网站代码中告诉 ajax 转到 /helloapp/say_hello

如果您的 rails 应用被命名为 "helloapp",您可以通过 here 描述的其中一种方式获得它,以在 rails 代码中访问您的应用名称。一旦你拥有它,你就可以将它存储在一个实例变量中,比如 @app_name,用于你的模板或 javascript(或者你发出 ajax 请求的任何地方)。我认为您正在寻找的是这些方面的内容:

var url = "/<%= @app_name %>/say_hello";
// do your ajax request with your new url variable

一种方法是修改所有js文件中所有ajax调用的url,并在url中添加@app_name。

如果您不想在所有 js file.Write 中编辑所有 ajax url,请将以下代码放在单独的 js 文件或 application.js 文件中:

$.ajaxSetup({
    beforeSend: function(data, settings) {
        var url = "/@app_name"+ settings.url;
        settings.url = url;

    }
});