为基于区域设置的URL现有ASP.NET网站添加子目录,正确解析相对路径

时间:2013-12-27 20:17:47

标签: asp.net seo iis-7.5 multilingual url-rewrite-module

现有的ASP.NET(MVC和webforms hybrid)网站显示翻译的内容。该语言基于存储用户偏好的cookie。用户更改设置时,URL没有变化。内容以首选语言重新加载。
对于SEO,区域设置应包含在URL中(support.google.com/webmasters/answer/182192?hl=en)。


我尝试过以下几点:
1)使用网址重写模块:http://www.iis.net/learn/extensions/url-rewrite-module/setting-http-request-headers-and-iis-server-variables
问题:
- 所有超链接和重定向仍指向没有区域设置的旧URL - 根据文件夹结构和用法要求复杂的出站规则(绝对路径和相对路径的混合,例如../,〜/,/)。 - 还需要根据文档
禁用静态压缩 - 由于Html的大小而导致的性能考虑因素。 - 由于相对路径重写中的问题,回发会导致运行时异常。 - 脚本文件中定义的路径(ajax加载等)是一个巨大的挑战 - 基本标记无法按预期工作,因为重写模块似乎附加了../(http://www.iis.net/learn/extensions/url-rewrite-module/url-rewriting-for-aspnet-web-forms#Using_tilda

2)IIS 7.5虚拟目录:
为每种语言创建虚拟目录并将其指向根目录。即www.example.com是根,www.example.com/fr-ca/是映射回根的虚拟目录 问题:
- 配置文件中的运行时异常,表示需要将虚拟目录转换为应用程序
- 将其转换为应用程序会因Web配置中的重复条目而导致500.19错误(因为虚拟目录指向根目录)
- 我尝试将根移动到另一个子目录(即每种语言都有一个物理目录)以避免Web配置冲突,但这会导致某种“内核”错误。此外,这将意味着改变应用程序的物理结构,并且还解决路由问题。

3)使用子域:
我还考虑过使用子域并为每种语言独立托管应用程序,但这有很多缺点,包括必须解决可扩展性,单点登录,cookie,特定领域的分析等问题。


那么在URL中包含语言子目录并使所有链接相对于该子目录的最痛苦的方法是什么?

注意:该网站包含绝对路径和相对路径的混合,例如(../,〜/,/)有时与ResolveClientUrl,ResolveUrl一起使用

1 个答案:

答案 0 :(得分:0)

最后,我们选择了选项2,步骤如下:

  1. 创建新文件夹,将应用程序的副本部署到新文件夹。新文件夹应与根应用程序位于不同的目录中。

  2. 在根应用程序下创建一个新的虚拟应用程序* (非虚拟目录);每种新语言1,指向新文件夹。 (如果将来需要,任何虚拟应用程序都可以指定为该特定语言定制的不同文件夹)

  3. 在新文件夹中,删除web.config文件的system.webServer部分中的模块和处理程序部分(它们将从父web.config继承)

  4. 如果您正在使用SQL会话状态,则需要在web.config中指定自定义应用程序名称,并修改TempGetAppID存储过程,以便所有虚拟应用程序中的应用程序名称相同。请参阅以下内容(http://blogs.msdn.com/b/toddca/archive/2007/01/25/sharing-asp-net-session-state-across-applications.aspx

  5. 希望使用Url.Content(MVC)或ResolveUrl(webforms)在服务器端解析所有链接。如果没有,他们需要修复。 javascript中指定的任何路径都不会自动解析为虚拟应用程序(它们仍将解析为root应用程序)

  6. 测试一下它。每一个环节。 (像ScreamingFrog这样的工具可能有助于确保没有返回404,但是它不会解决HTTP POST问题。

  7. 请注意,根据自定义错误处理和任何现有的URL重写规则,步骤可能会有所不同。

  8. 摘要:选项1(网址重写)完全不切实际。选项2(子目录)是最实用的解决方案,但它并不像它应该的那样简单。