.htaccess - htaccess 从 %{HTTP_HOST} 获取域名到变量中,减去 www

标签 .htaccess mod-rewrite

我目前在 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/

    相关文章:

    python - Django:从Apache mod_rewrite重定向时,错误的请求语法

    php - 在 Wordpress 中将图像设为私有(private)

    .htaccess - htaccess/mod_rewrite/SSL |如果 : http off and (basket or order), 301 https,否则 301 http

    regex - htaccess 重定向到 HTTPS,除了几个 url

    php - 丢失图像时出现 symfony 500 错误

    regex - .htaccess 301 重定向,保留路径

    .htaccess - 301重定向规则在不同的托管环境中给出不同的结果

    css - 使用 .htaccess 阻止目录

    apache - 重写以附加到查询字符串

    php - htaccess 将 slug 重写为 seo url