使用子目录的 Apache 反向代理的 Sharepoint

使用子目录的 Apache 反向代理的 Sharepoint

我们的团队刚接触 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 等):

  1. 切换错误方向的斜线。
  2. 将任何相对 URL(我假设以“/”开头的 URL 可以这样定义)转换为 http://external.site.com/appname/[URL]
  3. 使用 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。如果必须从该文件夹开始,您可以随时设置从该文件夹的重定向。这应该可以避免相对链接问题。

相关内容