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
相关产品推荐
相关产品推荐

