通过反向代理访问应用程序时,将删除Ajax表单属性

时间:2014-01-31 19:17:19

标签: jquery asp.net-mvc apache reverse-proxy

我有一个VB.NET MVC 4应用程序,它可以在本地和服务器上正常运行。但是我们使用Apache反向代理来提供对所有应用程序的访问,并且当为此实现时,将删除通过AjaxOptions生成的表单属性。

在这个例子中:

<% Using (Ajax.BeginForm("getAdminSearchResults", "InitiationSearchResults", New AjaxOptions With {.HttpMethod = "post", .OnSuccess = "updatePlaceholder", .UpdateTargetId = "lstSearchResults"}, New With {.id = "frmSearch"}))%>

没有反向代理,生成的HTML是:

<form action="/InitiationSearchResults/getAdminSearchResults?Length=23" data-ajax="true" data-ajax-method="post" data-ajax-mode="replace" data-ajax-success="updatePlaceholder" data-ajax-update="#lstSearchResults" id="frmSearch" method="post">

但是使用反向代理:

<form action="/InitiationSearchResults/getAdminSearchResults?Length=23" id="frmSearch" method="post">

这当然会导致视图将数据返回到整页而不是目标div。即使表单标记在视图上是硬编码的,反向代理也会最终删除data-ajax属性。我能够保留属性的唯一方法是在加载页面后通过jQuery设置它们。我一直在互联网上搜索,并没有成功找出为什么会发生这种情况。对此的任何帮助将不胜感激。也许需要更改设置或将其添加到反向代理配置中?

LoadModule proxy_module         /usr/lib/apache2-prefork/mod_proxy.so
LoadModule proxy_http_module    /usr/lib/apache2-prefork/mod_proxy_http.so
LoadModule proxy_html_module    /usr/lib/apache2/mod_proxy_html.so
LoadModule rewrite_module       /usr/lib/apache2/mod_rewrite.so
LoadModule headers_module       /usr/lib/apache2-prefork/mod_headers.so
LoadModule substitute_module    /usr/lib/apache2/mod_substitute.so
LoadModule proxy_balancer_module        /usr/lib/apache2/mod_proxy_balancer.so

NameVirtualHost 10.125.186.140:443
NameVirtualHost 10.125.186.140:80

<VirtualHost 10.125.186.140:443>

ErrorDocument 404 /unknown.html

SSLEngine On

SSLCertificateFile /Cert/wildcard.crt
SSLCertificateKeyFile /Cert/wildcard.key
SSLCertificateChainFile /Cert/lawson_root.crt
SSLCertificateChainFile /Cert/entrust_l1e_chain_bundle.crt

ServerName qa-initiation.company.com
SSLProxyEngine on
ProxyReceiveBufferSize 4096
ProxyRequests Off

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

ProxyHTMLEvents onclick ondblclick onmousedown onmouseup \
        onmouseover onmousemove onmouseout onkeypress \
                onkeydown onkeyup onfocus onblur onload \
                onunload onsubmit onreset onselect onchange

ProxyHTMLDocType HTML
ProxyHTMLEnable On
ProxyHTMLExtended On

Header add Access-Control-Allow-Origin https://qa-oe.company.com

ProxyPassMatch (?i)^/(.*) https://onlineinit.companyqa.local/
ProxyPass / https://onlineinit.companyqa.local/
ProxyPassReverse / https://onlineinit.companyqa.local/
ProxyHTMLURLMap https://www.companyqa.local https://qa-oe.company.com l

</VirtualHost>

1 个答案:

答案 0 :(得分:1)

抱歉,这不能解决您的问题,但可能会有用。

Apache的mod_proxy_html重写你的html并删除它无法识别的任何属性。例如,

<p style="color:white;" test="test"></p>

转换为

<p style="color:white;"></p>

通过反向代理后。反向代理还添加了DOCTYPE,并将内容包装在html和body标签中(如果不存在)。

除了关闭该文件/文件夹上的html重写之外,我还没有办法避免这种情况。我这样做是为了关闭它打破的页面,并在这些页面中使用相对链接:

<Location /path/to/badly/rewriten/stuff/>
SetOutputFilter none
</Location>

如果有更好的方法,我也想知道!