9

我目前在 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$ 为每个域单独运行规则,但现在有这么多域,为每个域都这样做是不可行的。

希望你能帮忙!提前致谢。

4

1 回答 1

14

您可以使用 a 捕获所需的主机部分RewriteCond并像%1RewriteRule

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$
RewriteRule ^$ ASSETS/%1/index.php [L]

文件系统级别(没有 htaccess)的替代解决方案可能是符号链接。与其提取必要的主机部分,不如使用指向真实目录的符号链接,例如

- 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\.)?(.+)中获取捕获组。
    请注意,这(?:...)是一个非捕获组。这就是为什么我们使用%1而不是%2.
于 2013-04-23T04:49:26.033 回答