如何通过Apache将访问者重定向到基于子域的唯一页面缓存目录

时间:2011-07-20 04:02:31

标签: apache .htaccess mod-rewrite

我们有一个rails应用程序正在处理来自m.host.comhost.com的请求。如果请求进入m.host.com,则rails应用页面缓存目录为/public/cache/m/,如果请求到达host.com,则页面缓存目录为/public/cache/www/

问题在于,对RewriteCondm.host.com的两个请求都匹配了第一个host.com

# if the `HTTP_HOST` starts with "m." (m.host.com), look for the cache in /cache/m/...
RewriteCond %{HTTP_HOST} ^m\..*
RewriteRule ^([^.]+)/$ /cache/m/$1.html [QSA]
RewriteRule ^([^.]+)$ /cache/m/$1.html [QSA]

# if not, look for the cache in /cache/www/...
RewriteCond %{HTTP_HOST} !^m\..*
RewriteRule ^([^.]+)/$ /cache/www/$1.html [QSA]
RewriteRule ^([^.]+)$ /cache/www/$1.html [QSA]

1 个答案:

答案 0 :(得分:2)

尝试一下:

# if the `HTTP_HOST` starts with "m." (m.host.com), look for the cache in /cache/m/...
RewriteCond %{HTTP_HOST} ^m\.
RewriteRule ^([^.]+)/?$ /cache/m/$1.html [L,QSA]

# if not, look for the cache in /cache/www/...
RewriteCond %{HTTP_HOST} !^m\.
RewriteRule ^([^.]+)/?$ /cache/www/$1.html [L,QSA]

通过在参数中添加“L”,告诉解析器当前的RewriteRule是应用于当前请求的最后一个。

此外,RewriteCond仅适用于单个下一个RewriteRule,这就是为什么您的重写对于任何请求都是相同的,解析器会将第二个RewriteRules应用于请求。