我目前在 htaccess 文件中有以下内容,如果根目录中不存在该文件,该文件会将某些请求重定向到所请求域的单个文件夹。
RewriteRule ^contact/?$ ASSETS/%{HTTP_HOST}/contact.php
RewriteCond %{REQUEST_URI} !^/ASSETS/%{HTTP_HOST}/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /ASSETS/%{HTTP_HOST}/$1
RewriteCond %{HTTP_HOST} ^(www.)?%{HTTP_HOST}$
RewriteRule ^(/)?$ ASSETS/%{HTTP_HOST}/index.php [L]
当我的域文件夹命名为/ASSETS/www.domain1.com、/ASSETS/www.domain2.com 等时,它可以正常工作
但是,我已经构建了很多代码,假设文件夹将被标记为/ASSETS/domain1.com 等(域名,减去 www。)
我在想有一种方法可以将域名从 %{HTTP_HOST} 获取到一个新变量中并去掉 www.部分(如 str_replace 或其他东西),但我找到的所有答案都是围绕基本重定向全部到 www。或没有 www。这是行不通的,因为我仍然希望用户从强制 www 访问该站点。版本。
我以前使用 RewriteCond %{HTTP_HOST} ^(www.)?domain1.com$ 为每个域单独运行规则,但是现在有这么多域,为每个域都这样做是不可行的。
希望你能帮忙!提前致谢。
最佳答案
您可以使用 RewriteCond
捕获所需的主机部分。并将其用作 %1
在 RewriteRule
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
RewriteRule ^$ ASSETS/%1/index.php [L]
文件系统级别(没有 htaccess)的替代解决方案可能是符号链接(symbolic link)。与其提取必要的主机部分,不如使用指向真实目录的符号链接(symbolic link),例如
- ASSETS -+-domain1.com (directory)
|
+-www.domain1.com -> domain1.com (symbolic link)
|
+-domain2.com (directory)
|
+-www.domain2.com -> domain2.com (symbolic link)
为了说明不同的反向引用,请参见另一个示例
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
RewriteRule ^foo/(.+)$ $1/%1/index.php [L]
$1
,它从 RewriteRule 模式中获取捕获组 foo/(.+)
. %1
,它从前面的 RewriteCond (?:www\.)?(.+)
中获取捕获组.请注意
(?:...)
是 non-capturing团体。这就是我们使用 %1
的原因。而不是 %2
. 关于.htaccess - htaccess 从 %{HTTP_HOST} 获取域名到变量中,减去 www,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16158649/