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



我的目标是在多域环境中对url强制执行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]

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

你能推荐一个解决方案,将这些规则组合成尽可能少的选项,同时实现我的目标并避免多次重定向吗

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

你试过吗

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

这应该是最符合你另外两条规则的公式。不过,您必须添加一个条件。

最新更新