Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在多域站点上使用mod_rewrite htaccess强制执行www和尾部斜杠_Regex_.htaccess_Mod Rewrite - Fatal编程技术网

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

Regex 在多域站点上使用mod_rewrite htaccess强制执行www和尾部斜杠,regex,.htaccess,mod-rewrite,Regex,.htaccess,Mod Rewrite,我的目标是在多域环境中强制执行www和URL尾部斜杠以实现这一点: http://mydomain.com/company -> http://www.mydomain.com/company/ # Convert http://mydomain.com/company -> http://www.mydomain.com/company/ # Enforce www and trailing slash # If you have subdomains, you can add

我的目标是在多域环境中强制执行www和URL尾部斜杠以实现这一点:

http://mydomain.com/company -> http://www.mydomain.com/company/
# 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前缀中排除,但仍然强制使用尾随斜杠,例如:

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/
为了让用户保持在当前的开发或移动站点上,需要避免这种情况

到目前为止我拥有的:

http://mydomain.com/company -> http://www.mydomain.com/company/
# 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]
此规则用于添加尾随斜杠,但它会将子域重定向回根域

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

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

你试过了吗

RewriteCond%{QUERY\u STRING}^$[NC]
在上重写cond%{HTTPS}s^|
重写规则^(.*/)?[^/\.]+)$http%1://%{http\U主机}%{REQUEST\U URI}/[R=301,L]

这应该是与你的另外两条规则最为一致的表述。不过,您必须添加一个条件。

与编程无关。也许最好问一下,或者这可能是一个很好的建议,但是这里有很多mod_重写问题,因为这是.htaccess文件独有的,而不是任何服务器配置,所以我认为这是最好的提问地点。关于mod_重写的问题似乎已经解决了。我看到了服务器故障的趋势,但没有明确的规则。把它放在这里,谢谢。这实际上是维护主机的最后一组规则。我一离开电脑就意识到我需要做的事情。我将把这个问题留一段时间,看看是否有人能巧妙地将任何规则集组合成更紧凑、更高效的东西。