“请求中的 URI 无效”尝试代理 iframe 内容以进行本地调试

Posted

技术标签:

【中文标题】“请求中的 URI 无效”尝试代理 iframe 内容以进行本地调试【英文标题】:"Invalid URI in request" trying to proxy iframe content for local debugging 【发布时间】:2014-06-17 15:52:05 【问题描述】:

我正在尝试调试包含 iframe 的页面中的问题。为父页面提供服务的站点是我正在处理的代码,我可以轻松地在本地运行,但 iframe 的内容来自我无权访问的代码。有一些保护阻止跨域 iframe,这在生产中不会成为问题,因为它们将在同一个域上运行。但是,我需要在本地调试一些东西,所以我使用 Apache 来代理站点。

另外,我所在的内部网络使用了 Apache 必须考虑的代理。

到目前为止我的 apache 配置:(请注意,我完全不喜欢 apache 配置)

RewriteEngine on
RewriteRule ^/(.+)\.aspx(.*)$   https://www.example.com/$1.aspx$2   [PT,L]
RewriteRule ^/(.+)\.aspx$   https://www.example.com/$1.aspx   [PT,L]
RewriteRule ^/static/(.+)$   https://www.example.com/static/$1   [PT,L]
RewriteCond  %SERVER_PORT !^8080$ 
RewriteRule ^(.*) http://%SERVER_NAME:8080%REQUEST_URI [P,L]


#SSLProxyEngine On
ProxyRequests On
ProxyRemote http://www.example.com http://pac.group.intranet:8080
ProxyRemote https://www.example.com http://pac.group.intranet:8080

aspx/static/ 是我试图在此处代理的另一个站点。我自己的网站在 8080 端口上运行。

我目前收到Invalid URI in request 的请求,看起来完全正常。在某些时候它似乎接受了我的请求,然后它抱怨 SSL,所以我添加了SSLProxyEngine On。它目前处于关闭状态,不会产生 SSL 错误,所以很明显问题发生在此之前。

在我添加SSLProxyEngine On 之后,它基本上可以正常工作,只是我还没有代理其他站点的静态资源。所以我添加了/static/ 行,然后我遇到了当前的问题。

我已经在这方面花费了太多时间,我就是想不通。我找不到任何明确的示例或教程来解释如何执行此操作。这似乎是一件显而易见的事情,但我就是无法让它发挥作用。但是现在删除它不会修复它。基本上,Apache 的行为似乎完全出乎意料。我不太了解这一点,无法理解为什么。

知道是什么导致了这个问题以及如何最终让它工作吗?

我在 Windows 上使用 XAMPP 3.2.1。

日志详情:

[Thu Jun 19 14:25:38.879301 2014] [ssl:warn] [pid 3248:tid 220] AH01909: RSA certificate configured for www.example.com:443 does NOT include an ID which matches the server name
[Thu Jun 19 14:25:38.924310 2014] [core:warn] [pid 3248:tid 220] AH00098: pid file C:/Workset/tools/xampp/apache/logs/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Thu Jun 19 14:25:39.262377 2014] [ssl:warn] [pid 3248:tid 220] AH01909: RSA certificate configured for www.example.com:443 does NOT include an ID which matches the server name
[Thu Jun 19 14:25:39.309387 2014] [mpm_winnt:notice] [pid 3248:tid 220] AH00455: Apache/2.4.4 (Win32) OpenSSL/0.9.8y php/5.4.19 configured -- resuming normal operations
[Thu Jun 19 14:25:39.309387 2014] [mpm_winnt:notice] [pid 3248:tid 220] AH00456: Server built: Feb 23 2013 13:07:34
[Thu Jun 19 14:25:39.309387 2014] [core:notice] [pid 3248:tid 220] AH00094: Command line: 'c:\\workset\\tools\\xampp\\apache\\bin\\httpd.exe -d C:/Workset/tools/xampp/apache'
[Thu Jun 19 14:25:39.310387 2014] [mpm_winnt:notice] [pid 3248:tid 220] AH00418: Parent: Created child process 7668
[Thu Jun 19 14:25:40.066538 2014] [ssl:warn] [pid 7668:tid 232] AH01909: RSA certificate configured for www.example.com:443 does NOT include an ID which matches the server name
[Thu Jun 19 14:25:40.441613 2014] [ssl:warn] [pid 7668:tid 232] AH01909: RSA certificate configured for www.example.com:443 does NOT include an ID which matches the server name
[Thu Jun 19 14:25:40.489623 2014] [mpm_winnt:notice] [pid 7668:tid 232] AH00354: Child: Starting 150 worker threads.
[Thu Jun 19 14:25:43.904305 2014] [core:error] [pid 7668:tid 1680] [client ::1:56999] AH00126: Invalid URI in request GET /foo/search/welcome.aspx?ask=bar HTTP/1.1
[Thu Jun 19 14:26:00.705665 2014] [core:error] [pid 7668:tid 1680] [client ::1:57001] AH00126: Invalid URI in request GET /foo/search/welcome.aspx?ask=bar HTTP/1.1

【问题讨论】:

您的 apache 错误日志是否显示任何信息?我不确定那里是否会报告 apache 级别的错误,我认为如果有问题我会首先查看它。 如果您的项目只是开发,请使用 http。可能是您正在做的事情或加载的内容正在做的事情需要 https 而另一部分正在提供 http。 apache 错误日志显示[Thu Jun 19 14:25:43.904305 2014] [core:error] [pid 7668:tid 1680] [client ::1:56999] AH00126: Invalid URI in request GET /foo/search/welcome.aspx?ask=bar HTTP/1.1 [Thu Jun 19 14:26:00.705665 2014] [core:error] [pid 7668:tid 1680] [client ::1:57001] AH00126: Invalid URI in request GET /foo/search/welcome.aspx?ask=bar HTTP/1. 【参考方案1】:

我终于让它工作了,我在这里为后代分享解决方案:

ProxyPassMatch ^(/.+)\.aspx(.*)$   https://www.example.com$0
ProxyPass /static    https://www.example.com/
ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

SSLProxyEngine On
ProxyRequests On
ProxyRemote http://www.example.com http://pac.group.intranet:8080
ProxyRemote https://www.example.com http://pac.group.intranet:808

这种方式实际上更清洁。不依赖重写规则,使用ProxyPassMatch作为正则表达式基本上是解决方案的核心。

【讨论】:

以上是关于“请求中的 URI 无效”尝试代理 iframe 内容以进行本地调试的主要内容,如果未能解决你的问题,请参考以下文章

html iframe清单代理,避免主页缓存

在网站前面使用反向代理将 http 请求从 iframe 中重定向到网站

iframes 和 Same-Origin-Policy 和反向代理 hack

使脚本等到iframe加载后再运行

让脚本等到 iframe 加载完毕后再运行

从 iframe 中获取 div 值