在IIS 6上发布重写的URL不起作用

时间:2009-12-18 16:40:26

标签: c# .net iis url-rewriting

我正在使用C#.net编程的网站上工作。它使用一个名为ADX Studio的CMS(一个早于那里的决定),它提供了一种形式的URL重写(据我所知,它可以通过将一个aspx页面指定为IIS中的默认404处理程序来实现)。

我有一个网页表单,它存在于重写的URL中。我对其进行了编辑,以便html表单的操作指向重写的URL:

var u = new Uri(Request.RawUrl.Split(new char[1] { ';' }).Last());
userAdminForm.Action = u.PathAndQuery;

(有些丑陋,但根据Request.RawUrl在这些重写的网址上的作用而有效。)

“漂亮”的URL是这样的:

http://www.site.com/admin/user/edit/

在我的开发框(Windows XP / IIS 5)上,当我最初尝试POST回到这样的URL时,我收到了HTTP 405错误。我通过adding a script mapping so Aspnet_isapi.dll handles all (*) requests解决了这个问题。在我的开发机器上一切正常。

我刚将更改推送到实时服务器(Windows Server 2003 R2和IIS 6),并且帖子无提示失败。页面刷新但我的所有逻辑(来自代码中的IsPostBack路径)都没有被命中。没有显示错误,它只是不起作用。

如果我删除了我的代码设置表单的.Action然后回发工作,但它发布到对应于aspx文件的物理位置而不是我的页面的丑陋URL。

我错过了一种简单的方法来完成这项工作吗?我不想切换URL重写方法或任何东西,因为这是一个很大的遗留站点,不幸的是,它非常依赖于ADX Studio,因此我不想做任何会破坏它的事情。

[编辑因为上面的代码以某种方式丢失了code突出显示]

3 个答案:

答案 0 :(得分:0)

问题是页面的<form>标记引用了“丑陋”的网址作为操作。您可以通过从表单中完全删除操作标记来解决此问题。默认情况下,浏览器将回发到同一页面,即。 “漂亮”的网址。

本文解释了如何完成“无动作”形式(约三分之二)http://msdn.microsoft.com/en-us/library/ms972974.aspx

答案 1 :(得分:0)

似乎问题与IIS 5上的问题相同。我可以通过在IIS管理器中执行以下操作来使其工作:

  • 右键单击相关网站,然后选择“属性”
  • 选择“主目录”标签
  • 点击“应用程序设置”
  • 中的“配置”
  • 点击“通配符应用程序地图”旁边的“插入”
  • 浏览到aspnet_isapi.dll的位置(在我的情况下:C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ aspnet_isapi.dll)
  • 取消“检查文件是否存在”
  • 点击“确定”回到俄罗斯对话框中。

这与我在IIS5的问题中链接的方法基本相同。但是,它并不是最佳的,因为IIS通过asp(甚至是静态文件)运行每个请求。这似乎只会让事情变慢。我希望能够指定asp只需要至少调用HTTP POST请求。

奇怪的是,IIS5在没有注册ISAPI扩展的情况下发布到扩展名时发出HTTP 405错误,但IIS6只是静默失败。页面正在通过IIS运行(我可以使用Page_Load函数中的断点进行调试),但IsPostBack(和IsCrossPagePostBack)未正确设置。它可能与视图状态有关吗?我的解决方案有其他替代方案吗?

答案 2 :(得分:0)

我认为我认为这是解决这个问题的最佳方案。事实证明,ADXStudio CMS确实使用默认的404规则来进行某种形式的URL重写。这与http POST:

有问题
  

当IIS最初执行自定义时   在404错误的URL上,它将POST更改为   GET,即使客户端进行POST   请求。

(感谢精英大脑关于setting up IIS6 and ASP.NET MVC的博文)。

我决定使用Ionics Isapi Rewrite Filter来重写我的网址,而不是创建自己的HttpModule。然后我将IIS中的404错误处理程序设置为默认值。我创建了这个IIRF.ini文件,将所有请求重定向到与生成的404处理程序相同的格式:

RewriteCond %{REQUEST_FILENAME}  !-d
RewriteCond %{REQUEST_FILENAME}  !-f
RewriteRule ^(.*)$               /Default.aspx?404;http://%{HTTP_HOST}$1  [U,L]

一切似乎都很好。优于my previous answer的优点是重写代码是低级别并且运行速度快,而-f和-d开关意味着如果文件实际存在则不会重写,因此静态文件不具有运行.net。

的开销