如果存在,则将子域重写为文件夹

时间:2017-01-29 22:29:20

标签: apache .htaccess

我有一个运行多个项目的Web服务器。我已经为他们分配了一些域名:

  • example.com
  • another-example.com
  • foo.bar.com

然后,我在每个项目的文件夹上创建了,所以我有以下结构:

  • 的/ var / WWW /
    • 的.htaccess
    • 项目/
      • 例如
      • 另一个-示例
      • FOO

我想重写网址,所以当从任何域访问我的服务器时,我会执行以下操作:

  1. 如果/ {/}文件夹中存在HTTP_HOST的域(或第一个子域,如果有的话),请将整个域重写为/projects/<PROJECT_NAME>
  2. 如果文件夹不存在,请不要执行任何操作(这意味着将显示404错误页面)
  3. 请注意,我不希望每个域(我当前的配置)都有一次重写,只需要一次通用重写。

1 个答案:

答案 0 :(得分:1)

这应该这样做:

RewriteCond %{ENV:PROJECT_PREPENDED} !=1
RewriteCond %{ENV:REDIRECT_STATUS} !^30
RewriteCond %{HTTP_HOST} ^([^.]+)
RewriteCond /var/www/projects/%1 -d
RewriteCond %{HTTP_HOST} ^([^.]+)
RewriteRule ^ projects/%1%{REQUEST_URI} [E=PROJECT_PREPENDED:1]

但我不喜欢这种做法。为什么不将项目文件夹命名为完整主机名?如清单所示。它更灵活,适合将来使用。无论如何,上面会按你指定的方式进行。

如果将项目目录命名为完整主机名,则简化为:

RewriteCond %{ENV:PROJECT_PREPENDED} !=1
RewriteCond %{ENV:REDIRECT_STATUS} !^30
RewriteCond /var/www/projects/%{HTTP_HOST} -d
RewriteRule ^ projects/%{HTTP_HOST}%{REQUEST_URI} [E=PROJECT_PREPENDED:1]

如果您想在两个域上使用相同的子域,或者在同一个域中使用两个不同的TLD,或者在另一个域中使用与该域名相同的子域,则不会让您陷入混乱。