【问题标题】:IIS URL Rewrite ASPIIS URL 重写 ASP
【发布时间】:2013-12-19 19:56:05
【问题描述】:

我尽我所能扫描论坛寻求帮助,以制作一个 web.config 来重写这种 url

domain.com/default.asp?id=3&language=2

我希望这是可以的

domain.com/en/service

language=2 是“en” 而id=3 是页面“服务”(此名称存在于 mySQL 中)

我只能找到反之亦然的例子......

像这样

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
      <match url="^enquiry$" />
      <action type="Rewrite" url="/page.asp" />
    </rule>
  </rules>
</rewrite>

我希望它是这样的......我知道这是不正确的,但也许可以解释我的问题。

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
     <match url="^default.asp?id=3&language=2$" />
     <action type="Rewrite" url="/en/serice" />
    </rule>
  </rules>
</rewrite>

【问题讨论】:

    标签: iis asp-classic url-rewriting


    【解决方案1】:

    如果你想使用正则表达式,你可以这样做

    <rule name="RewriteUserFriendlyURL1" stopProcessing="true">
         <match url="^([^/]+)/([^/]+)/?$" />
             <conditions>
                 <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                 <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
             </conditions>
         <action type="Rewrite" url="default.asp?language={R:1}&amp;id={R:2}" />
    </rule>
    

    这会将“domain.com/en/service”重写为“domain.com/default.asp?language=en&id=Service”,或将“domain.com/2/3”重写为“domain.com/default。 asp?language=2&id=3"

    要将 2 更改为 en 并将 3 更改为 service 以及所有其他选项,尽管我认为您需要为每个排列设置一个单独的规则,或者在您的 asp 页面中有某种逻辑来读取您的查询字符串变量和将相应的值发送到您的 SQL 查询。另请注意,友好 url 中的参数和重写 URL 中的查询字符串变量以相同的顺序出现,尽管这应该不是问题。如果有人尝试使用原始“不友好”的 url 访问页面,他们将找到他们正在寻找的内容,无论他们输入查询字符串变量的哪种方式。

    请注意,我实际上并没有手动编写上面的规则,我使用 IIS 管理器中的 URL 重写模块生成它 - 它让生活变得更轻松

    另请注意,正如在另一个答案中与我同名的讨论,这仅适用于 IIS7 及更高版本

    【讨论】:

      【解决方案2】:

      我在 Classic ASP 中使用自定义错误页面完成了此操作,这似乎是最好的方法,除非您使用安装在服务器上的某种第三方组件。

      为此,您需要在 IIS(或 web.config)中设置 404 错误以转到特定的自定义错误 Classic ASP 页面(例如 404.asp)。

      在此自定义错误页面中,您首先需要检查 URL 是否有效。如果是,您可以 Server.Transfer 到正确的页面,返回 200 响应代码,并在那里解析 URL 以将 URL 转换为数据库查找所需的值等。如果它不是有效的 URL,则显示自定义错误页面并返回 404 响应代码。

      检查有效 URL 和检索 URL 参数的代码将根据您的 URL 结构而有很大差异。但是要找到自定义 404 错误页面上请求的 URL,您必须查看查询字符串,它类似于“404;http://domain.com:80/en/service/”。

      下面是一些从请求的 URL 获取参数的示例代码:

      Dim strUrl, intPos, strPath, strRoutes
      strUrl = Request.ServerVariables("QUERY_STRING")
      If Left(strUrl, 4) = "404;" Then
          intPos = InStr(strUrl, "://")
          strPath = Mid(strUrl, InStr(intPos, strUrl, "/") + 1)
          If strPath <> "" Then
              If Right(strPath, 1) = "/" Then strPath = Left(strPath, Len(strPath) - 1)
          End If
          strRoutes = Split(strPath, "/")
      
          'Here you can check what parameters were passed in the url
          'eg. strRoutes(0) will be "en", and strRoutes(1) will be "service"
      
      End If
      

      以下是在 web.config(而不是 IIS)中设置自定义错误页面的方法:

      <?xml version="1.0"?>
      <configuration>
          <system.webServer>
              <httpErrors errorMode="Custom" existingResponse="Replace">
                  <remove statusCode="404" subStatusCode="-1" />
                  <error statusCode="404" subStatusCode="-1" responseMode="ExecuteURL" path="/404.asp" />
              </httpErrors>
          </system.webServer>
      </configuration>
      

      【讨论】:

      • 如果您使用的是 IIS7 或更高版本,则无需处理自定义错误页面,您只需要 web.config。 (或者您可以使用 IIS 管理器中的重写模块生成规则,该模块写入 web.config。)
      • @John,我们在这里谈论的是经典 ASP,而不是 .NET?
      • 是的,我说的是经典 ASP。 Web.Config 重定向适用于 IIS7 或 IIS8 中的经典 ASP 页面(或 .htm 页面)。我猜你需要在你的应用程序池中启用 .net 才能工作,但规则当然不限于 .net 页面。也许我们应该改变我们的用户名。这些 cmets 可能看起来像是在自言自语:)
      • @John(另一个),所以您可以使用 .NET Rewrite 模块重定向到经典 ASP 页面,并将参数添加到查询字符串中?这听起来像是一个有用的选择。
      • 是的,您可以在 url 中有一个查询字符串
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2016-06-27
      • 2013-06-16
      相关资源
      最近更新 更多