我们的团队刚接触 Apache。我们的内部服务器上有一个 SharePoint 2007 应用程序,地址为 http://internal.site.com。
我们需要使用 Apache 作为从面向外部的站点到内部服务器的反向代理。外部服务器的地址我们称之为http://external.site.com/应用程序名称。
问题出在 SharePoint 的相对链接上。SharePoint 页面中的链接可能指向“/_layouts/dir/subdir/page.aspx”,但当传递到代理时,此链接在页面中显示为 http://external.site.com/_layouts/...(没有附加 /appname)。因此,看来我们必须重写 URL。
但随后这又延伸到其他问题——SharePoint 生成的样式表、javascript 等中的相对 URL(即我们无法控制)。
SharePoint 还会创建一些类似“\u002flayouts\u002fuserdisp.aspx?Force=True\u0026ID=" 的 URL
到目前为止,我认为解决这个问题的最佳方法是针对每个 URL(包括样式表、javascript 等):
- 切换错误方向的斜线。
- 将任何相对 URL(我假设以“/”开头的 URL 可以这样定义)转换为 http://external.site.com/appname/[URL]“
- 使用 ProxyPass 和 ProxyPass 反向转换路径(现在应该都是绝对的并且格式正确)。
这可能是对的,也可能是错的,我欢迎您就如何做得更好提出意见。
为了实现这一目标,到目前为止,我得到了一个配置文件,我确信它在很多方面都是错误的,但我认为这是一个开始。我也想听听你们对如何更好地实现我的想法的意见。
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /appname/ http://internal.site.com/
ProxyPassReverse /appname/ http://internal.site.com/
<Location /appname/>
ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLLogVerbose On
#List of HTML elements to change
ProxyHTMLLinks a href
ProxyHTMLLinks area href
ProxyHTMLLinks link href
ProxyHTMLLinks img src longdesc usemap
ProxyHTMLLinks object classid codebase
data usemap
ProxyHTMLLinks q cite
ProxyHTMLLinks blockquote cite
ProxyHTMLLinks ins cite
ProxyHTMLLinks del cite
ProxyHTMLLinks form action
ProxyHTMLLinks input src usemap
ProxyHTMLLinks head profile
ProxyHTMLLinks base href
ProxyHTMLLinks script src for
# To support scripting events (with ProxyHTMLExtended On),
# you'll need to declare them too.
ProxyHTMLEvents onclick ondblclick onmousedown onmouseup \
onmouseover onmousemove onmouseout onkeypress \
onkeydown onkeyup onfocus onblur onload \
onunload onsubmit onreset onselect onchange
#Goal: Map any URL that starts with a / (i.e. a relative link) to
http://internal.site.com/
ProxyHTMLURLMap ^/ http://internal.site.com/
</Location>
提前感谢您提供的任何帮助!
祝一切顺利,肖恩
答案1
您面临的困难很常见:您想使用与应用程序预期不同的 URI 路径来访问 Web 应用程序。标准 Apache 代理机制仅处理标头(例如,Location:
标题)中的链接,而不处理文档内容中的链接,因此使用绝对路径的链接/images/foo.png
不再到达正确的位置(相对路径通常可以正常工作)。
一种常见的解决方案是使用mod_proxy_html模块,它允许您在网页内容中执行替换。事实上,本教程恰好涵盖了您所描述的情况。
答案2
为什么不使用子域而不是文件夹来执行此操作:
https://efg.site.com而不是https://www.site.com/efg。如果必须从该文件夹开始,您可以随时设置从该文件夹的重定向。这应该可以避免相对链接问题。