在多域网站上使用mod_rewrite htaccess强制执行www和尾部斜杠

时间:2012-12-13 19:16:32

标签: regex .htaccess mod-rewrite

我的目标是在多域环境中对网址实施www和尾随斜杠:

http://mydomain.com/company -> http://www.mydomain.com/company/

问题是必须从www前缀中排除某些子域,但仍然强制执行尾部斜杠,例如:

http://m.mydomain.com/company -> http://m.mydomain.com/company/

另外一个因素是我需要维护任何子域以避免多次重定向。例如:

http://dev.mydomain.com/login -> http://dev.mydomain.com/login/

多次重定向会导致:

http://dev.mydomain.com/login -> http://mydomain.com/login/

需要避免这种情况,以使用户保持在当前的开发者或移动站点上。

到目前为止我有什么:

# Convert http://mydomain.com/company -> http://www.mydomain.com/company/
# Enforce www and trailing slash
# If you have subdomains, you can add them to
# the list using the "|" (OR) regex operator
RewriteCond %{HTTP_HOST} !^(www|dev|m)\.
RewriteCond %{HTTPS}s ^on(s)|
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]

这适用于缺少www前缀和尾部斜杠的域,并在1重定向中添加它们。

# Convert http://mydomain.com/company/ -> http://www.mydomain.com/company/
# Enforce www
# If you have subdomains, you can add them to
# the list using the "|" (OR) regex operator
RewriteCond %{HTTP_HOST} !^(www|dev|m)\.
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

如果存在尾部斜杠,则此方法有效,如果缺少,则添加www前缀。

我不知道的是,如果存在子域并且缺少尾部斜杠,则会重定向用户的方法。

RewriteCond %{QUERY_STRING} ^$    [NC]
RewriteRule ^((.*/)?[^/\.]+)$ /$1/ [R=301,L]

此规则适用于添加尾部斜杠,但它会将子域重定向回根域。

您能否推荐一个将这些规则组合到尽可能少的选项中,然后实现目标并避免多重重定向的解决方案?

1 个答案:

答案 0 :(得分:1)

对于RewriteRule指令,模式与对应于请求的文件系统路径匹配。因此,要么使用RewriteCond和合适的变量,要么在构建替换时使用适当的变量,以生成URL而不是路径。

你试过吗

RewriteCond %{QUERY_STRING} ^$    [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^((.*/)?[^/\.]+)$ http%1://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]

这应该是与你的其他两个规则最同步的表述。但是,您必须为此添加条件。