我在Tomcat前面使用IIS7应用程序请求路由作为ISAPI重定向的替代.基本的反向代理功能运行良好,但我在最终请求标头中没有足够的信息.我的应用程序存在于几个子域:customerone.ourservice.com,customertwo.ourservice.com等.每个子域运行相同的应用程序,但具有不同的品牌图形.
应用程序当前查看Host标头以告知要显示的品牌.当我使用IIS7反向代理时,该信息将丢失.我的标题现在是:
accept = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-charset = ISO-8859-1,utf-8;q=0.7,*;q=0.7
accept-encoding = gzip,deflate
accept-language = en-gb,en;q=0.7,en-us;q=0.3
cookie = JSESSIONID=......
host = 127.0.0.1:8080
max-forwards = 10
user-agent = Mozilla/5.0 (X11; U; Linux x86_64; en-GB; rv:1.9.0.15) Gecko/2009102815 Ubuntu/9.04 (jaunty) Firefox/3.0.15
x-original-url = /
x-forwarded-for = [iis7ip]:47567
x-arr-log-id = affbf81c-a5cf-4212-a43b-901cd9adcee6
connection = Keep-Alive
Run Code Online (Sandbox Code Playgroud)
有什么办法可以将原始主机头插入反向代理传递的请求头中吗?
注意:我已经花了几个小时挖掘答案,但找不到答案.
我有一个ASP.NET MVC(2.0)应用程序,托管在IIS7(集成模式)上.
当发出GET请求时/Toons/List- 我得到一个/Toons/List/预期的重定向(302).
问题
但是当我发送POST请求时,请说/Toons/Add(注意没有尾随斜杠)服务器再次返回,重定向(302)/Toons/Add/.此时,FireFox错误地将GET请求发送到该重定向到URL.即[GET] /Toons/Add/代替[POST] /Toons/Add/.这是不正确的,但已知的行为.由于没有[GET] /Toons/Add/- 我没有找到资源(404).
我使用webhost4life托管我的应用程序并且无法访问IIS7,这限制了我对URL重写和使用模块的使用(我正在与他们一起解决这个问题).但是ISAPI是最好的方式吗?我不知道这样做会感觉很好.
这是一个常见的问题,我很惊讶我找不到一个简单的解决方案.
是否存在不涉及使用.aspx/.mvc后缀和URL重写的解决方案?
在这两个中,如果必须的话,我应该选择哪一个?
有什么想法/建议吗?
编辑:
我已经阅读http://www.hanselman.com/blog/ASPNETMVCAndTheNewIIS7RewriteModule.aspx,正如我所说,我正在努力寻找一个更简单的解决方案,一个"正常工作"选项.
编辑:
我已经看到解决方案与/每个URL 附加斜杠(),再次,似乎不是最优雅的解决方案.
我正在尝试设置IIS URL重写规则以匹配403响应,因为有人在禁用目录浏览时尝试浏览目录.我想然后将它们重定向到我为404定义的通常的ASP.NET自定义错误页面.
这就是我目前所拥有的:
<outboundRules>
<!-- By default, browsing a directory with no default resource will return 403 -->
<rule name="Directory browsing location">
<match serverVariable="RESPONSE_LOCATION" pattern="(.*)" />
<conditions>
<add input="{RESPONSE_STATUS}" pattern="^403" />
</conditions>
<action type="Rewrite" value="/Error/PageNotFound?aspxerrorpath={PATH_INFO}"/>
</rule>
<rule name="Directory browsing status code" patternSyntax="ExactMatch">
<match serverVariable="RESPONSE_STATUS" pattern="403" />
<action type="Rewrite" value="302" />
</rule>
</outboundRules>
Run Code Online (Sandbox Code Playgroud)
我的假设是它需要是一个出站规则,我需要重写状态代码并添加位置响应头,尽管后者在最初的403响应中不会存在.
目前的行为是......没有.无论我做多少调整,我仍然会看到403s.有什么想法吗?
顺便说一下,不,网站上没有任何合法的403可以被吞下.我还可以为可能导致满足条件的每个路径创建入站规则,但这不是很可扩展.
我有以下网址:
http://domain.com/index.php?m=feedback&cSubject=My Subject
Run Code Online (Sandbox Code Playgroud)
我想要一个重写规则,以便以下内容:
http://domain.com/feedback?Subject=My Subject
Run Code Online (Sandbox Code Playgroud)
映射到上一个URL.这是我目前的统治:
RewriteRule ^feedback?Subject=(.*)$ index.php?m=feedback&cSubject=$1
Run Code Online (Sandbox Code Playgroud)
似乎没有工作!有任何想法吗?
我正在使用IIS 7 Rewrite模块重写传入的URL,如:
至
一切正常,除非在处理重写请求时,我使用MVC的UrlHelper.GenerateUrl()方法:
UrlHelper.GenerateUrl(
"Assets",
"Css",
"Asset",
new RouteValueDictionary(new { site = site.Name, assetPath = assetPath }),
RouteTable.Routes,
controllerContext.RequestContext,
false);
Run Code Online (Sandbox Code Playgroud)
调用此方法会导致HttpException:
System.Web.HttpException: Cannot use a leading .. to exit above the top directory.
at System.Web.Util.UrlPath.ReduceVirtualPath(String path)
at System.Web.Util.UrlPath.Reduce(String path)
at System.Web.VirtualPath.Combine(VirtualPath relativePath)
at System.Web.VirtualPathUtility.Combine(String basePath, String relativePath)
at System.Web.Mvc.PathHelpers.GenerateClientUrlInternal(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.PathHelpers.GenerateClientUrl(HttpContextBase httpContext, String contentPath)
at System.Web.Mvc.UrlHelper.GenerateUrl(String routeName, String actionName, String controllerName, RouteValueDictionary routeValues, RouteCollection routeCollection, RequestContext requestContext, Boolean includeImplicitMvcValues)
Run Code Online (Sandbox Code Playgroud)
查看RequestContext,似乎所有请求路径都是正确的(即,具有重写的值).我似乎无法弄清楚为什么它试图退出顶级目录...我们在路径中没有使用....
我还确保RewriteModule位于IIS中的UrlRouting模块之上.
虽然我可以进入框架方法,但我无法检查任何局部变量(在VS或WinDbg中),因为它已经过编译器优化.
有什么想法吗?
对不起noob问题,无法理解我应该搜索什么.
我正在制作一个product.php?id=777
我喜欢的网页product/777
谢谢!
我正在使用ASP .NET rewriteModule将http://example.com重写为http://www.example.com.
<section name="rewriteModule" type="RewriteModule.RewriteModuleSectionHandler, RewriteModule"/>
Run Code Online (Sandbox Code Playgroud)
然后我把它放在里面<system.webServer>.
<rewrite>
<rules>
<rule name="Canonical" stopProcessing="true">
<match url=".*"/>
<conditions>
<add input="{HTTP_HOST}" pattern="^([a-z]+[.]com)$"/>
</conditions>
<action type="Redirect" url="http://www.{C:0}/{R:0}" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)
现在我想删除页面末尾的所有.aspx.例:
http://www.example.com/Register.aspx
将变成:
http://www.example.com/Register/
我怎样才能做到这一点?
我正在使用IIS7在GoDaddy上进行共享虚拟主机托管.
我正在尝试优化我的"位置"指令,并且找不到确定是否尝试特定位置匹配的好方法.使用echo位置块内不帮助这里.
NGINX ngx_http_core_module文档有点令人困惑.
要使用正则表达式,必须使用前缀:
~ 区分大小写的匹配
~* 对于不区分大小写的匹配
如何进行比赛:
具有=与查询完全匹配的前缀的指令.如果找到,搜索停止.
所有剩余的指令与传统的字符串.如果此匹配使用^~前缀,则搜索停止.
正则表达式,按照在配置文件中定义的顺序.
如果#3产生匹配,则使用该结果.否则,使用#2的匹配.
这里的数字2表示"常规字符串",但后来说它可以与^~前缀一起使用.并不~意味着RegExp?如果没有,它如何确定什么不是RegExp?
具体来说,我想要以下内容:
/assets直接提供任何文字.停止搜索.
\.php$|/$通过快速CGI STOP SEARCH提供与RegExp匹配的任何内容.
通过文字直接提供其他所有内容 /
这样,只有/匹配尝试从资源外部提供的非动态文件.
我有:
location ^~ /assets {} # search-terminating literal? or regex?
location ~ \.php$|/$ {}
location / {} # is this match always attempted?
Run Code Online (Sandbox Code Playgroud)
从文档中,看起来实际的顺序是1-3-2,始终运行文字/匹配.是的,这种优化不会对实际性能产生任何影响,但我只是想澄清一些含糊之处.
即时通讯使用XAMPP但我无法在本地主机上使用.htaccess文件.我尝试了这么多次..在线工作不错.但本地主机显示[在此服务器上找不到请求的URL]
我的根文件夹是真实的
localhost/acre/real/property_available.php
localhost/acre/real/properties
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /acre/real/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^properties$ /property_available.php/$1 [NC,QSA]
</IfModule>
Run Code Online (Sandbox Code Playgroud)
请
我一直在为wordpress开发一个完全有效的语言插件.现在唯一缺少的是网址重写.我一直在关注stackoverflow上的很多网站,资源和其他问题,但我似乎无法让我的永久链接工作.
我已经能够像这样添加一个查询字符串变量:
public function append_query_string($url)
{
$args = array('lang' => $this->get_locale());
return add_query_arg($args, $url);
}
add_filter('page_link', array($this, 'append_query_string'));
add_filter('post_link', array($this, 'append_query_string'));
add_filter('the_permalink', array($this, 'append_query_string'));
Run Code Online (Sandbox Code Playgroud)
这会改变我的链接http://www.mylink.com?lang=en_us,例如.我现在想要的是添加一个permastruct,以便用户可以拥有漂亮的url(例如http://www.mylink.com/en/)
我添加了以下代码:
public function add_query_var($vars)
{
$vars['lang'] = $this->get_locale();
return $vars;
}
add_filter('request' , array($this, 'add_query_var'), 10, 2 );
public function custom_permastruct()
{
add_permastruct('language', '%lang%', false);
}
add_action('wp_loaded', array($this, 'custom_permastruct'));
Run Code Online (Sandbox Code Playgroud)
我现在唯一需要的是重写规则,我猜想,但我可能完全错了.谁知道添加这个permastruct的最佳解决方案是什么?
编辑
我一直试图让这个工作一个月,我似乎无法掌握永久链接,甚至没有所有以前的答案和我自己的研究.所以这就是为什么我再次以赏金来发布这篇文章的原因.我需要的是:我有一个返回语言代码的函数(get_locale).该语言代码应在我的URL中实现,如下所示:"http://www.mywebsite.com/LANGUAGE_HERE/..."
我知道我需要为此注册我自己的永久链接结构,但这就是一切都出错的地方.我需要什么过滤器以及我应该在过滤器功能中添加什么?非常感谢任何帮助,因为我在这里非常绝望.
编辑2
所以我添加了重写规则,但它们似乎也没有用.我在这里有点绝望.无论如何,这是重写规则的代码:
public function add_rewrite_rules()
{
$languages = $this->get_all_languages();
foreach($languages as $language) {
add_rewrite_rule('^' . $language->code . …Run Code Online (Sandbox Code Playgroud) url-rewriting ×10
asp.net ×3
iis ×3
apache ×2
mod-rewrite ×2
web-config ×2
.htaccess ×1
.net ×1
arr ×1
asp.net-mvc ×1
iis-7 ×1
localhost ×1
nginx ×1
permalinks ×1
php ×1
wordpress ×1