Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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
Apache .htaccess使用结束标志将多个子域重定向到文件夹_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache .htaccess使用结束标志将多个子域重定向到文件夹

Apache .htaccess使用结束标志将多个子域重定向到文件夹,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我正在为一个用户建立一个网站,很明显,他们有很多以前指向特定文件夹的子域。我宁愿找到一些方法,让他们自己通过创建相关目录来管理,而不是每次他们想要添加/更改虚拟主机时,我都不断添加虚拟主机或更改.htaccess规则 因此,我想到了使用catch-all vhost,并使用.htaccess将子域定向到正确的文件夹 现在我知道有人问过类似的问题,但我正试图用一个规则集实现这一点,而不执行完整的HTTP重定向 目前我有以下规则,但我遇到了一个奇怪的问题 RewriteCond %{REQUEST_

我正在为一个用户建立一个网站,很明显,他们有很多以前指向特定文件夹的子域。我宁愿找到一些方法,让他们自己通过创建相关目录来管理,而不是每次他们想要添加/更改虚拟主机时,我都不断添加虚拟主机或更改
.htaccess
规则

因此,我想到了使用catch-all vhost,并使用
.htaccess
将子域定向到正确的文件夹

现在我知道有人问过类似的问题,但我正试图用一个规则集实现这一点,而不执行完整的HTTP重定向

目前我有以下规则,但我遇到了一个奇怪的问题

RewriteCond %{REQUEST_URI} !^/\.well-known
RewriteCond %{HTTP_HOST} !=www.example.co.uk [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.example\.co\.uk [NC]
RewriteRule ^(.*)$ /%1/$1 [L,END,QSA]
基本上,这个想法是为了避免
。众所周知的
,这样LetsEncrypt就可以使用文档根来获取任何子域的证书,避免
www.
,它应该使用标准路径,但然后匹配并重定向任何其他子域

如果没有
END
,这将以服务器错误和
超过日志中10条内部重定向
消息的限制而结束。这至少似乎证实了它的匹配和重定向

然而,当使用
END
关键字时,据我所知,重写只应该发生一次;不过我看到了奇怪的行为

对于特定的路径,它似乎可以正常工作

GET /index.html HTTP/1.1
Host: journey.example.co.uk

HTTP/1.1 200 OK
... snip content from /journey/index.html ...
但如果我不给出路径,它似乎在处理重定向两次

GET / HTTP/1.1
Host: journey.example.co.uk

HTTP/1.1 404 Not Found

... snip ...
<p>The requested URL /journey/journey/index.html was not found on this server
... snip ...
GET/HTTP/1.1
主持人:travely.example.co.uk
未找到HTTP/1.1 404
... 剪
在此服务器上找不到请求的URL/Tourney/Tourney/index.html
... 剪

如果使用了
%1
,它应该是主机名的第一部分,
$1
,在这种情况下,它应该是一个
/
,或者是空的,我看不出它是如何在重写路径中完成两次
旅程的。

我想我自己可能会通过第十次查看重写标志文档并找到它来实现这一点

nosubreq|NS Causes a rule to be skipped if the current request is an internal sub-request.
进一步的文档讨论了与我的问题无关的SSI,但它确实提到了以下内容:

Also, when mod_dir tries to find out information about possible directory default files (such as index.html files), this is an internal subrequest, and you often want to avoid rewrites on such subrequests
我的理解是对
/
的请求导致
mod_dir
index.html
发出子请求,这导致两个请求和两个重写

至少在一些快速测试中,将上述标志添加到规则中似乎是可行的。因此,以下规则似乎允许将任何子域重定向到文档根目录下的同一命名目录

RewriteCond %{REQUEST_URI} !^/\.well-known
RewriteCond %{HTTP_HOST} !=www.example.co.uk [NC]
RewriteCond %{HTTP_HOST} ^(.+)\.example\.co\.uk [NC]
RewriteRule ^(.*)$ /%1/$1 [END,NS]

只是几件小事。。。如果使用
END
标志,则不需要
L
标志。并且在此实例中不需要
QSA
标志。默认情况下会传递查询字符串,除非在替换中显式包含查询字符串。@MrWhite,谢谢,这很有意义。我也没有意识到查询字符串已经被传递了,除非重写目标上有一个特定的字符串。