Apache htaccess:将所有子域重定向到主https www域

Apache htaccess:将所有子域重定向到主https www域,apache,.htaccess,redirect,mod-rewrite,Apache,.htaccess,Redirect,Mod Rewrite,我一直在使用htaccess重定向,混合了一些关于htaccess重定向的答案 我的目标是将每个子域(不是www)重定向到我的主子域(从开始),保持请求URI(如指定的文件夹)不变 以下是我所做的: RewriteEngine On RewriteCond %{HTTP_HOST} ^(.+)\.mydomain\.fr$ [NC] # OR : RewriteCond .* ^(.+)\.%{HTTP_HOST}%{REQUEST_URI}$ [NC] RewriteCond %{HT

我一直在使用htaccess重定向,混合了一些关于htaccess重定向的答案

我的目标是将每个子域(不是www)重定向到我的主子域(从开始),保持请求URI(如指定的文件夹)不变

以下是我所做的:

RewriteEngine On

RewriteCond %{HTTP_HOST} ^(.+)\.mydomain\.fr$ [NC]
# OR : RewriteCond .* ^(.+)\.%{HTTP_HOST}%{REQUEST_URI}$   [NC]

RewriteCond %{HTTP_HOST} !^www\.mydomain\.fr$  [NC]
RewriteRule ^ https://www.mydomain.fr%{REQUEST_URI} [L,R=301,QSA]
此配置不重定向(强文本为错误重定向):

  • test.mydomain.fr=>
  • test.mydomain.fr/foo=>
  • mydomain.fr=>
  • =>
  • www.mydomain.fr=>
交换
RewriteCond%{HTTP\u HOST}^www\.mydomain\.fr$[NC]

RewriteCond%{HTTP\u HOST}^https://www\.mydomain\.fr[NC]
给了我错误的重定向。 我的想法是检查HTTP_主机是否符合格式,如果没有,则重定向到包含请求信息的良好URL
重写规则^https://www.mydomain.fr/%{REQUEST_URI}

为什么会出现错误的重定向? 我是否必须编写两组条件和规则来首先检查子域,然后检查HTTPS?(我目前正在尝试使用一个规则和几个条件进行重定向,这可能不是最佳做法)

编辑:我的目标是实现以下重定向:

  • test.mydomain.fr=>
  • test.mydomain.fr/foo=>
  • mydomain.fr=>
  • =>
  • www.mydomain.fr=>
提前感谢您的回答/想法

编辑2:

我尝试了拉赞对这个问题的回答,它似乎做了我想做的事情,除了一件事:如果我在浏览器中的URL类似于
https://foobar.mydomain.fr
,浏览器向我显示一个关于安全性的红色大警告,我必须接受风险,然后重定向到
https://www.mydomain.fr
。如何删除此警告

#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_HOST} !^www\.mydomain
RewriteRule ^(.*)$ https://www.mydomain.fr%{REQUEST_URI} [L,R=301]

#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

将这两条规则替换为一条规则:

RewriteEngine On

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.mydomain\.fr$  [NC]
RewriteRule ^ https://www.mydomain.fr%{REQUEST_URI} [L,R=301,NE]

在完全清除浏览器缓存后测试更改。

用以下单个规则替换两个规则:

RewriteEngine On

RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\.mydomain\.fr$  [NC]
RewriteRule ^ https://www.mydomain.fr%{REQUEST_URI} [L,R=301,NE]


在完全清除浏览器缓存后测试更改。

什么是
https://foo.mydomain.fr => https://foo.mydomain.fr
什么意思?两个URL都是相同的,什么都没有发生?我已经编辑了我的问题以添加我想要的重定向@DusanBajic:我想取消子域foo。@anubhava:我想尝试httpS而不是http,你需要通配符证书,所以我需要更多的步骤来实现我想要的。谢谢你的回答!
https://foo.mydomain.fr => https://foo.mydomain.fr
什么意思?两个URL都是相同的,什么都没有发生?我已经编辑了我的问题以添加我想要的重定向@DusanBajic:我想取消子域foo。@anubhava:我想尝试httpS而不是http,你需要通配符证书,所以我需要更多的步骤来实现我想要的。谢谢你的回答!您好,此解决方案修复了重定向
www.mydomain.fr
=>
https://www.mydomain.fr
,但如果我在浏览器中输入:
https://foobar.domain.fr
URL仍然相同。输入的URL不是以www开头的,因此应该接受它进行重定向。但似乎不是。“www”!=“foobar”为什么Apache看不到这一点?谢谢此规则也适用于子域,但子域应指向与主域的DocumentRoot相同的目录。是否有任何方法重定向每个子域(通配符)?所以子域没有目录声明,只有主域。(参见编辑2)。谢谢,现在您的问题是
如何删除SSL证书警告
,不幸的是,答案是您不能。原因是,在Apache加载任何模块进行重定向/重写之前,会发生与浏览器的SSL握手。由于您的SSL证书用于主域,因此访问
https://foobar.maindomain.fr
抛出此警告。避免此警告的唯一方法是使用通配符SSL证书,该证书通常比单个域的常规SSL证书昂贵。顺便说一句,编辑部分中的规则与我的单一重定向规则的作用完全相同。谢谢你的回答,我会接受它,因为它可以实现我想要的所有重定向,并且你解释了为什么我不能为SSL子域执行重定向。谢谢,唯一不同的是
https://foobar.maindomain.fr
在您的解决方案出现SSL警告后,没有进行任何重定向,甚至承担了风险。(我已经做了几个测试,没有缓存,但我要再次测试)。您好,这个解决方案修复了重定向
www.mydomain.fr
=>
https://www.mydomain.fr
,但如果我在浏览器中输入:
https://foobar.domain.fr
URL仍然相同。输入的URL不是以www开头的,因此应该接受它进行重定向。但似乎不是。“www”!=“foobar”为什么Apache看不到这一点?谢谢此规则也适用于子域,但子域应指向与主域的DocumentRoot相同的目录。是否有任何方法重定向每个子域(通配符)?所以子域没有目录声明,只有主域。(参见编辑2)。谢谢,现在您的问题是
如何删除SSL证书警告
,不幸的是,答案是您不能。原因是,在Apache加载任何模块进行重定向/重写之前,会发生与浏览器的SSL握手。由于您的SSL证书用于主域,因此访问
https://foobar.maindomain.fr
抛出此警告。避免此警告的唯一方法是使用通配符SSL证书,该证书通常比单个域的常规SSL证书昂贵。顺便说一句,编辑部分中的规则与我的单一重定向规则的作用完全相同。谢谢你的回答,我会接受它,因为它可以实现我想要的所有重定向,并且你解释了为什么我不能为SSL子域执行重定向。谢谢,唯一不同的是
https://foobar.maindomain.fr
在您的解决方案出现SSL警告后,没有进行任何重定向,甚至承担了风险。(我已经做了很多了