Apache Rewrite:如何根据域名(而不是 HTTP_HOST)编写规则?

Apache Rewrite:如何根据域名(而不是 HTTP_HOST)编写规则?

我已经编写了一个基于 HTTP_HOST(www.domainname.com)工作的 RewriteRule,但我希望它仅基于域名部分(domainname.com)工作。

进一步澄清

文件夹结构是/var/www/domainName.com

当我在 apache conf 文件中写入此规则时

RewriteRule ^/js/(.*) /%{HTTP_HOST}/js/$1 [L]

并使用 www.mydomain.com 访问该网站——它会尝试查找/var/www/www.domainName.com不存在的文件夹。

因此,我需要转换上述规则以从 HTTP_HOST 中删除“www”。

答案1

我建议您重定向请求,而不是让同一个网站在两个地方可用。要么创建一个新的 VirtualHost 来重定向流量:

<VirtualHost *:80>
    ServerName www.domainName.com
    Redirect / http://domainName.com/
</VirtualHost>

或者在其他规则之上添加一组规则,这些规则将检测 www. 前缀的存在并重定向用户:

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule /(.*) http://%1/$1 [R,L]

如果您确实希望您的网站在两个域名上都无需任何重定向,那么您可以使用 RewriteCond 仅提取域名,然后它将作为 %1 提供给 RewriteRule。

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.*) [NC]
RewriteRule ^/js/(.*) /%1/js/$1 [L]

答案2

我怀疑您是否可以做到这一点,创建指向适当目录的链接不是更容易吗?

ln -s yourdomain.com www.yourdomain.com

答案3

您尝试过使用吗%{DOCUMENT_ROOT}

Servername也有可能,如果您在 vhost 中设置为与目录结构中使用的名称相同的名称,例如:

<VirtualHost *:80>
  DocumentRoot /var/www/domainame.com
  ServerName domainame.com
  ServerAlias www.domainame.com
</VirtualHost>

然后您就可以%{SERVER_NAME}在重写规则中使用。

答案4

据我了解,你的问题只需设置你的文档根目录到正确的目录:

DocumentRoot /var/www/domainName.com

相关内容