如何使用 Apache 正确配置反向代理,以用于跨域 AJAX?

2024-01-09

需要开发一个高度依赖 API 的 Web 应用程序,但同时不能与 API 本身驻留在同一域中,因此在发出异步 HTTP 请求时绕过“同源策略”非常棘手(阿贾克斯)。 有一次,有人建议我在我的计算机(运行 Windows 7)上安装 WAMP 并使用 Apache 配置反向代理。 同一个人给了我下面的 Apache 指令,我将其添加到httpd.conf文件,告诉我为名为 127.0.0.1 的 IP 创建一个别名dev,在文件内c:\windows\system32\drivers\etc\hosts(我做了):

LoadModule headers_module modules/mod_headers.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule ssl_module modules/mod_ssl.so

Listen 127.0.0.1:8080
ProxyRequests off

<Proxy *>
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
</Proxy>

<VirtualHost dev:8080>
                ProxyPass / https://app.somesite.com:5002/
                ProxyPassReverse / https://app.somesitecom:5002/
                ProxyPassReverseCookieDomain app.somesite.com dev
                Header edit Location ^https://dev(:8080)?(.+)$ http://dev$1$2
                Header edit Set-Cookie "(^.+); secure; HttpOnly$" "$1; HttpOnly"
                SSLProxyEngine on
    SSLProxyVerify none
</VirtualHost>

由于我在配置服务器方面完全是新手,因此我只是粘贴了指令,幸运的是,代理起作用了。当我使用浏览器的地址栏访问时,它会从API返回正确的响应,例如,http://dev:8080/a/w/currencies.

但不幸的是,对同一 URL(代码如下)的 AJAX 请求使 Chrome 给我XMLHttpRequest cannot load http://dev:8080/a/w/currencies. Origin http://dev is not allowed by Access-Control-Allow-Origin. error.

$.ajax({
    url: "http://dev:8080/a/w/currencies",
    type: "GET",
    dataType: "json",
    data: {

    },
    success: function(data){
        console.log(data);
    }
}); 

那么为了让这个代理能够与 AJAX 一起工作,还必须做什么呢? 有人告诉我一些关于alias指令性,但不够具体和清晰,所以对我缺乏经验的大脑来说没有多大意义。

PS:另外,有人告诉我“问题是你从 dev:80 获取文件并 ajax 到 dev:8080”。鉴于我缺乏经验,这都没有多大意义。


您拥有一台具有公共 IP 的服务器,并且 apache 正在其上运行。现在您希望在 LAN 上托管您的应用程序,并且还希望它们可以通过 Internet 访问,重要的是这些应用程序仍然在 LAN 上的计算机上运行。

                           |--------------192.168.1.3
                           |            (internal3.example.com)
                           |
                           |--------------192.168.1.4
                           |            (internal4.example.com)
  (Public IP )             |
            A--------------|
(reverse proxy server)     |
  (192.168.1.25)           |
example.com                |
                           |--------------192.168.1.1
                           |            (internal1.example.com)
                           |
                           |--------------192.168.1.2
                           |            (internal2.example.com)

我正在使用 Ubuntu 来托管 Apache,如果是基于 Debian 的系统,则虚拟主机定义是在其上完成的

/etc/apache2/sites-enabled/*.conf

其中 *conf 对应于

内部1.conf 内部2.conf 内部3.conf 内部4.conf

每个站点的虚拟主机定义如下

/etc/apache2/sites-enabled/internal1.example.conf

<virtualhost *:80>
    ServerAdmin webmaster@localhost
    ServerName internal1.example.com
    ProxyRequests off
    <proxy *>
        Order deny,allow
        Allow from all
    </proxy >
    ProxyPass / http://192.168.1.1/
    ProxyPassReverse / http://192.168.1.1/ 
</VirtualHost>

/etc/apache2/sites-enabled/internal2.example.conf

<virtualhost *:80>
      ServerAdmin webmaster@localhost
      ServerName internal2.example.com
      ProxyRequests off
      <proxy *>
      Order deny,allow
      Allow from all
      </proxy >
      ProxyPass / http://192.168.1.2/
      ProxyPassReverse / http://192.168.1.2/
</VirtualHost >

/etc/apache2/sites-enabled/internal3.example.conf

<virtualhost *:80>
      ServerAdmin webmaster@localhost
      ServerName internal3.example.com
      ProxyRequests off
      <proxy *>
      Order deny,allow
      Allow from all
      </proxy >
      ProxyPass / http://192.168.1.3/
      ProxyPassReverse / http://192.168.1.3/
</VirtualHost >

/etc/apache2/sites-enabled/internal4.example.conf

<virtualhost *:80>
    ServerAdmin webmaster@localhost
    ServerName internal4.example.com
    ProxyRequests off
    <proxy *>
        Order deny,allow
        Allow from all
    </proxy>
    ProxyPass / http://192.168.1.4/
    ProxyPassReverse / http://192.168.1.4/
</VirtualHost>

请注意,在上述所有虚拟主机定义中,我删除了日志文件的选项。 因此,如果您应用于生产服务器,请将它们添加到每个 vhost 文件中。 上面只是给您一个清晰的示例来说明它是如何工作的。 我运行了一个非常复杂的 Apache 设置,所以上面只是一个小例子来帮助您。

现在来谈谈你问题的Ajax部分

在 chrome 中按 Ctrl+Shift+I 您将看到应用程序到底在哪里损坏, 它会给你一些线索,(从与您正在开发 Web 应用程序的计算机不同的计算机发出请求) 另外,如果您可以查看 apache 日志,如果请求来自http://sample具有 ajx api 的页面实际上到达了您的 apache 服务器,这将为您提供更多提示,如果代理正确转发您的请求,请使用 firefox 中的某些工具(如 live_http)发布 HTTP 标头,在没有请求时的情况下以及在没有请求时的情况下请求是由应用程序发出的,通过这种方式观察标头可以帮助您确定请求是否到达了反向代理后面的服务器,还可以检查运行反向代理的服务器的日志是否来自网络的请求到达了它,以及该请求是否到达了该服务器。到达所请求的 URL 是什么。这将为您提供线索,

出于开发目的,在您的 .conf 文件中禁用重写规则一段时间以进行测试,一一进行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Apache 正确配置反向代理,以用于跨域 AJAX? 的相关文章

  • jquery ajax加载后丢失CSS

    大家知道如何解决 load Ajax 请求后的 css 问题吗 例如 如果我想从网页加载 DIV 在我的 Ajax 请求之后 container load path to div div id 我丢失了与该 div 关联的所有 css 和脚
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 在对 VSTS API 的 Ajax 调用中使用 OAuth Bearer Token 而不是 PAT

    我已成功让我的 ASP NET MVC5 应用程序在服务器端用 C 读取和写入 VSTS 工作项 然而 为了获得最佳的用户体验 我真的想使用 Ajax 进行一些更新 我已经能够使用在我自己的帐户下创建的个人访问令牌 PAT 完美地完成此操作
  • 如何轻松地将 Ajax、perl 和 JSON 结合使用?

    我正在尝试使用 Ajax 制作一个网页 Example 我创建了一个 Perl CGU 文件来触发一个简单的帖子 文件 test cgi name 托马斯 回复短信 你的名字是托马斯 我创建了一个可以使用该帖子的 html 文件 但随后页面
  • Apache 虚拟主机始终重定向到 /dashboard

    我遇到的问题似乎是一个常见问题 但我找到的任何解决方案似乎都不适合我的情况 我正在尝试设置一个虚拟主机 以便我可以通过 mytestdomain local 访问我的 Laravel 安装的公共文件 但是当我在 google chrome
  • 使用 WSGI 在 Windows XAMPP 中设置 Python 路径

    我正在 Webfaction 上设置实时服务器的开发版本 在本地计算机上的虚拟 Apache 服务器环境 运行没有任何错误 中运行 Django 应用程序 XP 使用 Python 2 6 运行 XAMPP Lite 我可以提交更改通过 G
  • Capistrano 和 XSendFile 配置

    我正在尝试使用 Apache 2 2 Passenger 4 0 59 和 XSendFile 0 12 配置 Rails 生产服务器 应用程序通过 Capistrano 部署 部署的应用程序生成 可能很大 PDF Rails root t
  • 在 jQuery DataTables 中的 Ajax 请求后在 td 中添加 html 元素

    我想在获得 ajax 响应后在 td 中添加 html 元素 结果将是这样的 tr td class mycus class span class mycus class2 XYZ span td td class mycus class
  • 无法更改 Xampp 中的 Apache 端口号

    我刚刚下载了Xampp服务器xampp win32 1 8 2 0 VC9 zip http www apachefriends org en xampp windows html 641文件 Windows 并尝试启动 apache 服务
  • 从单个 javascript 函数向两个不同的 PHP 脚本发送两个 Ajax 请求

    是否可以同时向两个或多个 Php 脚本发送 Ajax 请求 我知道这可以串行实现 从 1 获取响应 然后从另一个获取响应 但我想知道是否可以同时实现 请协助我使用以下代码 function calShowUpload if http rea
  • 如果文件名减去扩展名,.htaccess url 重写行为将被覆盖。与网址相同

    我正在尝试整理 URL 并从中删除 php 扩展名等 我位于网站的基本文件夹中 因此没有可以优先处理的父 htaccess 文件或其他文件 这是我的 htaccess 代码 RewriteEngine On RewriteRule give
  • JSONP 使用 JQuery 从 HTTPS 协议获取 JSON

    我正在尝试获取从 https 安全站点发送的 JSON 客户端希望不要使用任何服务器端语言 全部都是 Javascript 我读到 当使用 Jquery 中的 ajax 函数时 我必须使用 JSONP 才能从安全站点加载 JSON 我的第一
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 如何在MAMP中设置环境变量?

    如何在 MAMP 版本 3 3 中设置环境变量 我可以在我的 PHP 应用程序中使用它 我已经更新了 Applications MAMP Library bin envvars and envvars std file并添加以下行 Lice
  • 当复选框条件更改时,如何使用ajax更新mysql数据库?

    我有一个在客户端按行显示的文章表 每篇文章都有一个唯一的 ID 并包含一个复选框以指示该文章是否被选中为收藏夹 如果它是最喜欢的 则该复选框已被选中 如果没有 则未选中 现在 如果特定于每一行的复选框条件发生变化 我需要 js 或 jque
  • CckEditor - 从 AJAX 加载的模板

    我正在使用 CkEditor 并且想要定义一个自定义模板 该模板使用 AJAX 函数来加载 HTML 字符串 我已经能够定义自定义模板 但如果我对模板对象的 html 属性使用函数 则该函数永远不会执行 是否可以使用 AJAX 和默认模板插
  • 如何让Gmail像加载进度条一样

    我想在页面的中心和顶部创建一个像 Gmail 一样的加载进度条 并适用于所有浏览器 这是基本代码
  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 通过 AJP 将 REMOTE_USER 转发到 tomcat(例如用于 shibboleth)

    今天我刚刚遇到了以下问题 1 我将apache配置为基本身份验证 需要有效用户 这有效 2 我进一步配置 apache 将某些路径 在我的例子中为 idp 的请求转发到 tomcat servlet shibboleth IDP 结果是 s
  • 用于网络服务器日志分析的软件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我可以得到一些关于 Apache 2 2 访问日志文件的优秀日志分析软件的建议 最好有一些理由 吗 我听说过韦巴利泽 http www w

随机推荐