基于子域和内容类型的不同重定向

时间:2014-07-11 19:32:05

标签: apache .htaccess mod-rewrite redirect

我必须根据两个不同的标准完成不同的重定向:a)域/子域和b)内容类型(带有分片子域的CDN)。

Apache .htaccess的重定向条件应该完成:

  • 避免在没有子域的情况下访问(强制使用Varnish的无Cookie子域);
  • 处理特定于语言的子域
  • 阻止网络用户(包括机器人/抓取工具)访问邮件服务器的子域,
  • 如果请求非静态内容,则
  • 处理对主要子域的静态内容的分片子域的请求(CDN的子域不应被机器人/抓取工具编入索引)。

我将下面的重定向怪物砍掉了,根据Opera的Firebug,它似乎正在起作用(或多或少):

<IfModule mod_rewrite.c>
  RewriteEngine on
  # Redirect example.com to de.example.com.
  RewriteCond %{HTTP_HOST} ^example\.com$ [NC]
  RewriteRule ^(.*)$ http://de.example.com/$1 [L,R=301]
  …
  # Redirect www.example.com to de.example.com.
  RewriteCond %{HTTP_HOST} ^www.example.com [NC]
  RewriteRule ^(.*)$ http://de.example.com/$1 [L,R=301]
  # Redirect mail.example.com to de.example.com.
  RewriteCond %{HTTP_HOST} ^mail.example.com [NC]
  RewriteRule ^(.*)$ http://de.example.com/$1 [L,R=301]
  # Redirect cdn.example.com to to de.example.com for all non image requests.
  RewriteCond %{HTTP_HOST} cdn.example.com [NC]
  RewriteCond %{REQUEST_URI} !\.(png|gif|jpg|jpeg|ico)$ [NC]
  RewriteRule ^(.*)$ http://de.example.com/$1 [L,R=301]
  # Redirect js.example.com to to de.example.com for all non js requests.
  RewriteCond %{HTTP_HOST} js.example.com [NC]
  RewriteCond %{REQUEST_URI} !\.(js|…)$ [NC]
  RewriteRule ^(.*)$ http://de.example.com/$1 [L,R=301]
  # Redirect css.example.com to to de.example.com for all non css requests.
  RewriteCond %{HTTP_HOST} css.example.com [NC]
  RewriteCond %{REQUEST_URI} !\.(css|…)$ [NC]
  RewriteRule ^(.*)$ http://de.example.com/$1 [L,R=301]
  …
</IfModule>

这些重定向提供来自CDN子域的静态内容; js.example.com/somepage正确重定向到de.example.com/somepage。但是,访问js.example.com(服务器的根目录)重定向到de.example.com。此外,浏览器的状态栏似乎表示重定向链,但我不知道如何正确分析潜在的循环重定向。所以似乎有些不对劲,但我还没能解决它。

这种复杂的重写是.htaccess正确的方法,是否有更智能的方法来完成基于子域和内容类型的不同重定向?

0 个答案:

没有答案