【问题标题】:mod_rewrite proxy RewriteRule not workingmod_rewrite 代理 RewriteRule 不起作用
【发布时间】:2009-11-27 03:31:51
【问题描述】:

我需要将对目录 home/alphauser 的所有请求发送到 backend/alphauser,而不是对 home/alphauser 目录中的文件的请求。例如:

http://home/alphauser -> http://backend/alphauser http://home/alphauser/ -> http://backend/alphauser http://home/alphauser/icon.png -> http://home/alphauser/icon.png http://home/alphauser/index.html -> http://home/alphauser/index.html

我在 home/alphauser/ 目录中创建了一个“.htaccess”文件,内容如下:

重写引擎开启
RewriteRule ^$ http://backend/alphauser [P]

mod_rewrite 允许按预期访问 home/alphauser/ 目录中的文件,但是当请求目录本身时,无论是否带有斜线:

http://home/alphauser
http://home/alphauser/

..浏览器 (firefox) 会显示一个文件下载弹出窗口,其中指出:

您选择打开一个文件
是一个:httpd/unix-目录

文件的内容是来自后端/alphauser 的正确 html(这是 JSP 的 url 模式),因此返回的有效负载是正确的。似乎 apache 正在发回这种奇怪的 mime 类型的“httpd/unix-directory”

救命!

【问题讨论】:

  • 当您将其发送到带有[P] 标志的 mod_proxy 时,您的设置是否正确?我有一种感觉,可能是因为这个。你的日志说什么?您可以使用 T 标志设置 RewriteRule 的 mimetype,例如 [T=text/html] 但我认为这不是最好的解决方案。
  • 我已经在我的 apache2.conf 中使用了 ProxyPass 指令,所以我假设 mod_proxy 设置正确。 error.log 没有任何内容,access.log 仅显示带有用户代理信息的 GET "/alphauser/" 消息。我用 [P,T=text/html] 尝试了相同的 RewriteRule,结果完全一样。
  • 我在 apache2.conf 中设置了一个 RewriteLog 指令并将日志级别设置为 9。输出看起来正常:(1)applying pattern ^$ to uri ''(2)rewrite -> backend/alphauser(3)forcing proxy-throughput with backend/alphauser(4 ) go-ahead with proxy request proxy:backend/alphauser [OK]

标签: apache mod-rewrite


【解决方案1】:

原来问题与 mod_rewrite 无关。我的后端根本没有发送 ContentType 标头。一旦我将其设置为将 ContentType 填充为 text/html 一切正常。

【讨论】:

    【解决方案2】:

    罗伯特,

    这对我来说似乎很奇怪

    RewriteEngine on
    RewriteRule ^$ http://backend/alphauser [P]
    

    您所做的正则表达式基本上匹配任何足够公平的内容,但它不会将 URI 传递给后端。

    RewriteEngine on
    RewriteRule ^/alphauser/$ http://backend/alphauser [P]
    

    RewriteRule ^/$ http://backend/alphauser [P]
    

    我不是 100% 确定 mod_rewrite 在 .htaccess 文件中的行为方式

    我认为这很有意义,您还必须确保启用了mod_proxymod_proxy_http,否则它将无法正常工作。

    【讨论】:

    • 不走运。 mod_proxy 已启用,因为我已经在 apache2.conf 中使用了 ProxyPass 和 ProxyReversePass 指令。
    • 其实,正则表达式^$的目的是不匹配文件,只匹配目录。我对传递 URI 不感兴趣——.htaccess 已经在 alphauser 目录中——所以要传递的 URI 是已知的。我希望对 /alphauser/ 目录本身的请求传递给 Servlet/JSP 和其他请求以正常进行。
    • 感谢您的帮助。我尝试了您对RewriteRule ^/$ http://backend/alphauser [P] 的建议,但它没有通过JSP 获取http://home/alphauser 的URL。我查看了重写日志,它显示:applying pattern '^/$' to uri '' 评估为 false,因为字符串不是以 / 开头
    • 好的,那么你的^$ 没问题,你有访问后端服务器的权限吗?
    猜你喜欢
    • 2023-04-05
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    相关资源
    最近更新 更多