0

我的目标是在多域环境中强制执行 www 和 url 上的斜杠以实现此目的:

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]

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

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

4

1 回答 1

1

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

你有没有尝试过

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

这应该是与您的其他两个规则最同步的公式。不过,您必须为此添加一个条件。

于 2012-12-13T19:51:46.653 回答