AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 550147
Accepted
asciiphil
asciiphil
Asked: 2013-11-02 07:50:08 +0800 CST2013-11-02 07:50:08 +0800 CST 2013-11-02 07:50:08 +0800 CST

Apache 2.2 和内容过滤器(可能还有 mod_proxy)是否存在错误?

  • 772

我在 RHEL 6(实际上是 Scientific Linux 6.4)上运行 Apache 2.2.15-29,我正在尝试设置具有内容重写的反向代理,因此代理网页上的所有链接都被重写以引用代理主机. 我在重写一些内容时遇到了问题,我想知道这是一个错误还是我做错了什么(以及如何做对,如果适用)。

我正在将内部主机 ( internal.example.com/foo) 上的子目录代理到外部主机 ( ) 的根目录上external.example.com。我需要重写 HTML、CSS 和 Javascript 内容来修复所有 URL。我还在外部主机上本地托管了一些内容,我认为这不是问题,但为了完整起见,我在这里提及。

我的 httpd.conf 大致如下:

<VirtualHost *:80>
    ServerName external.example.com
    ServerAlias example.com

    # Serve all local content directly, reverse-proxy all unknown URIs.
    RewriteEngine On
    RewriteRule ^(/(index.html?)?)?$ http://internal.example.com/foo/ [P]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [L]
    RewriteRule ^/~ - [L]
    RewriteRule ^(.*)$ http://internal.example.com$1 [P]

    # Standard header rewriting.
    ProxyPassReverse / http://internal.example.com/foo/
    ProxyPassReverseCookieDomain  internal.example.com external.example.com
    ProxyPassReverseCookiePath /foo/ /

    # Strip any Accept-Encoding: headers from the client so we can process the pages
    # as plain text.
    RequestHeader unset Accept-Encoding

    # Use mod_proxy_html to fix URLs in text/html content.
    ProxyHTMLEnable On
    ProxyHTMLURLMap http://internal.example.com/foo/ /
    ProxyHTMLURLMap http://internal.example.com/foo /
    ProxyHTMLURLMap /foo/ /

    ## Use mod_substitute to fix URLs in CSS and Javascript
    #<Location />
    #    AddOutputFilterByType SUBSTITUTE text/css
    #    AddOutputFilterByType SUBSTITUTE text/javascript
    #    Substitute "s|http://internal.example.com/foo/|/|nq"
    #</Location>

    # Use mod_ext_filter to fix URLs in CSS and Javascript
    ExtFilterDefine fixurlcss mode=output intype=text/css cmd="/bin/sed -rf /etc/httpd/fixurls"
    ExtFilterDefine fixurljs mode=output intype=text/javascript cmd="/bin/sed -rf /etc/httpd/fixurls"
    <Location />
        SetOutputFilter fixurlcss;fixurljs
    </Location>
</VirtualHost>

text/html 重写工作得很好。当我使用 mod_substitute 或 mod_ext_filter 时,外部服务器将页面发送为Transfer-Encoding: chunked,发送所有数据,然后关闭连接而不发送最终的零长度块。一些 HTTP 客户端对此不满意。(例如,Chrome 不会处理以这种方式发送的任何内容,因此页面不会应用 CSS。)

这是一个示例 wget 会话:

$ wget -O /dev/null -S http://external.example.com/include/jquery.js
--2013-11-01 11:36:36--  http://external.example.com/include/jquery.js
Resolving external.example.com (external.example.com)... 192.168.0.1
Connecting to external.example.com (external.example.com)|192.168.0.1|:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Date: Fri, 01 Nov 2013 15:36:36 GMT
  Server: Apache
  Last-Modified: Tue, 29 Oct 2013 13:09:10 GMT
  ETag: "1d60026-187b8-4e9e0ec273e35"
  Accept-Ranges: bytes
  Vary: Accept-Encoding
  X-UA-Compatible: IE=edge,chrome=1
  Content-Type: text/javascript;charset=utf-8
  Connection: close
  Transfer-Encoding: chunked
Length: unspecified [text/javascript]
Saving to: `/dev/null'

    [ <=>                                                         ] 100,280     --.-K/s   in 0.005s  

2013-11-01 11:36:37 (19.8 MB/s) - Read error at byte 100280 (Success).Retrying.

--2013-11-01 11:36:38--  (try: 2)  http://external.example.com/include/jquery.js
Connecting to external.example.com (external.example.com)|192.168.0.1|:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 416 Requested Range Not Satisfiable
  Date: Fri, 01 Nov 2013 15:36:38 GMT
  Server: Apache
  Vary: Accept-Encoding
  Content-Type: text/html;charset=utf-8
  Content-Length: 260
  Connection: close

    The file is already fully retrieved; nothing to do.

难道我做错了什么?我遇到了某种 Apache 错误吗?我需要做什么才能让它工作?(请注意,我更喜欢在 RHEL-6 打包的 RPM 中工作的解决方案,并且升级到 Apache 2.4 将是最后的手段,因为目前我们在这个系统上围绕 2.2 构建了很多基础设施。)

apache-2.2
  • 1 1 个回答
  • 4239 Views

1 个回答

  • Voted
  1. Best Answer
    asciiphil
    2013-11-14T13:53:10+08:002013-11-14T13:53:10+08:00

    事实证明,这是 mod_proxy_html 中的一个错误:https ://www.apachelounge.com/viewtopic.php?t=3552和http://marc.info/?l=apache-httpd-users&m=127237168923132&w=2 . 我在第一个链接中应用了代码更改,分块内容开始正常工作。

    • 2

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve