You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MVC5多语言站点默认语言en如何通过IIS URL Rewrite移除URL路径语言码

方案1:通过IIS URL Rewrite工具实现

前提:确保你的IIS服务器已经安装了URL Rewrite模块,之后直接在站点根目录的web.config文件的<system.webServer>节点下添加如下规则即可:

<system.webServer>
  <rewrite>
    <rules>
      <!-- 规则1:旧带/en路径301重定向到无/en路径,避免SEO重复 -->
      <rule name="RemoveEnPrefixRedirect" stopProcessing="true">
        <match url="^en(/.*)?$" />
        <conditions logicalGrouping="MatchAll">
          <add input="{REQUEST_METHOD}" pattern="^GET$" /> <!-- 只重定向GET请求,不影响POST提交 -->
        </conditions>
        <action type="Redirect" url="{R:1}" redirectType="Permanent" appendQueryString="true" />
      </rule>
      <!-- 规则2:无/en前缀的路径内部重写到带/en路径,供MVC路由识别 -->
      <rule name="AddEnPrefixInternalRewrite" stopProcessing="true">
        <match url="^(.*)$" />
        <conditions logicalGrouping="MatchAll">
          <!-- 排除其他语言前缀的路径,替换为你实际支持的非默认语言码 -->
          <add input="{REQUEST_URI}" pattern="^/(fr|de|jp)/.*" negate="true" />
          <!-- 排除静态资源和目录 -->
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Rewrite" url="en/{R:1}" appendQueryString="true" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

注意事项

  • 规则里的fr|de|jp需要替换为你站点实际支持的所有非默认语言码,避免误重写其他语言的路径
  • 生产环境验证规则时,可先把redirectType="Permanent"改为redirectType="Temporary",确认规则无误后再改回永久重定向,避免浏览器缓存错误的重定向规则

方案2:MVC原生路由实现(无需依赖IIS模块)

如果你不想依赖IIS的URL Rewrite模块,或者后续有跨服务器部署的需求,可直接通过MVC的路由规则实现,和你现有的属性路由也能完美兼容:

步骤1:配置路由规则

在RouteConfig.cs的路由注册逻辑中,按优先级先注册非默认语言的带前缀路由,再注册默认语言(英文)的无前缀路由:

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        
        // 非默认语言路由:带语言前缀
        routes.MapRoute(
            name: "NonDefaultLanguageRoute",
            url: "{lang}/{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
            constraints: new { lang = @"fr|de|jp" } // 替换为所有非默认语言码
        );

        // 默认语言(英文)路由:不带语言前缀,默认lang参数为en
        routes.MapRoute(
            name: "DefaultLanguageRoute",
            url: "{controller}/{action}/{id}",
            defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

        // 如果你用了属性路由,保留原有注册逻辑即可,可通过RoutePrefix特性统一适配语言前缀规则
        // routes.MapMvcAttributeRoutes();
    }
}

步骤2:兼容旧路径重定向

如果需要兼容旧的带/en前缀的URL,可添加一个全局动作过滤器,检测到请求路径带/en前缀时做301重定向:

public class EnPathRedirectFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        if (request.HttpMethod == "GET" && request.Url.AbsolutePath.StartsWith("/en"))
        {
            var newPath = request.Url.AbsolutePath.Substring(3);
            var redirectUrl = newPath + request.Url.Query;
            filterContext.Result = new RedirectResult(redirectUrl, permanent: true);
        }
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
}

然后在FilterConfig.cs中注册这个过滤器即可。

方案优势

不依赖IIS组件,跨部署环境兼容,即使后续迁移到非IIS服务器(比如Linux下的Kestrel、Nginx)也可以正常运行,和MVC的路由逻辑深度集成,扩展更灵活。


内容的提问来源于stack exchange,提问作者Bambam Deo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 13:54:01