【问题标题】:.htaccess multiple-domain rewrite.htaccess 多域重写
【发布时间】:2012-10-29 21:16:43
【问题描述】:

我正在寻找一种在一个虚拟主机帐户上支持多个域的解决方案,这必须通过 htaccess 来完成。所以想法是,您调用 domainx 并使用 htaccess 服务器将 webroot“伪造”到与域名对应的子文件夹。我已经有了一个“解决方案”,但这并不完美。

我遇到的问题:

  1. 通过 PHP 重定向(使用 CodeIginiter 的 base_url()),结果是;例如“http://www.domein1.nl/domein1.nl/”。
  2. 它在我的本地服务器上不起作用。

那么,我目前使用的 htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} domein1.nl$ [NC]
RewriteCond %{REQUEST_URI} !^/domein1.nl/.*$
RewriteRule ^(.*)$ /domein1.nl/$1 [L]

RewriteCond %{HTTP_HOST} domein2.nl$ [NC]
RewriteCond %{REQUEST_URI} !^/domein2.nl/.*$
RewriteRule ^(.*)$ /domein2.nl/$1 [L]

</IfModule>

base_url() 的 CodeIgniter PHP 代码。 服务器变量“SCRIPT_NAME”添加了第二个域文件夹,标记为问题 1。如果根文件夹被正确伪造,则不会发生这种情况;但这真的可能吗?

if (isset($_SERVER['HTTP_HOST']))
{
$base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
$base_url .= '://'. $_SERVER['HTTP_HOST'];
$base_url .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
}

最后但并非最不重要的一点是,当我通过主机文件进行重定向时,它无法在我的本地服务器上运行:

192.168.2.9 local.domein1.nl
192.168.2.9 local.domein2.nl

Sooo.. 我该如何解决这些问题?提前致谢!

编辑:我的本地服务器的问题已修复。咳嗽“sudo a2enmod rewrite”成功了。

Edit2:由于stormdrain 开始介绍文件夹结构,这里是我的澄清多个CI 应用程序。

主 .htaccess 位置/webroot

/public_html/.htaccess

域 1:

/application/domain1/ (domain1 application path)
/application/system/ (shared system path)
/public_html/domain1/index.php (CI domain1 index)

域2:

/application/domain2/ (domain2 application path)
/application/system/ (shared system path)
/public_html/domain2/index.php (CI domain2 index)

【问题讨论】:

  • 为什么不简单地在 apache 中设置 2 个虚拟主机?

标签: php apache .htaccess codeigniter mod-rewrite


【解决方案1】:

目前尚不清楚您要做什么。听起来您有多个域名指向同一台服务器,您没有完全控制权,因此无法设置 VirtualHosts。您还希望使用单个应用程序为域提供服务,并且不将子文件夹作为 URL 的一部分(例如,您不希望 http://www.domain1.nl/domain1.nl 作为 URL 的主页)。

如果是这样,这可能有效:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{HTTP_HOST} domein1.nl$ [NC]
    RewriteRule ^(.*)$ /domein1/$1 [L]

    RewriteCond %{HTTP_HOST} domein2.nl$ [NC]
    RewriteRule ^(.*)$ /domein2/$1 [L]

</IfModule>

然后在 CodeIgniter 中创建路由来路由请求:

$route["/domein2/(:any)"] = "/domein2/$1";

要让重写在本地工作,您需要将域添加到 .htaccess 文件:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{HTTP_HOST} local.domein1.nl$ [NC]
    RewriteRule ^(.*)$ /domein1/$1 [L]

    RewriteCond %{HTTP_HOST} local.domein2.nl$ [NC]
    RewriteRule ^(.*)$ /domein2/$1 [L]

</IfModule>

那么 base_url 不应该需要 SCRIPT_NAME,因为它正在被重写并从 URL 中路由出去:

if (isset($_SERVER['HTTP_HOST']))
{
    $base_url = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
    $base_url .= '://'. $_SERVER['HTTP_HOST']. '/';
}

更新。

如果每个域都有一个 CI 文件夹,例如:

/var/www/domain1/index.php
/var/www/domain1/application/
/var/www/domain1/system/
等等

/var/www/domain2/index.php
/var/www/domain2/application/
/var/www/domain2/system/
等等

RewriteCond %{HTTP_HOST} domain1.nl$ [NC]
RewriteRule ^(.*)$ /domain1/$1 [L]

RewriteCond %{HTTP_HOST} domain2.nl$ [NC]
RewriteRule ^(.*)$ /domain2/$1 [L]

应该为您完成这项工作。

【讨论】:

  • 因此,如果每个域都有一个 CI 文件夹,那么重写应该可以工作(它在本地为我工作)并且您可以忽略路由。我更新了答案...
  • 如果你去掉了 base_url 配置的 SCRIPT_NAME 部分,它不应该回到第一种情况。能够访问其他域是有道理的......毕竟这不是做你正在做的事情的正确设置。也就是说,您可以在每个站点的 index.php 中为$_SERVER['HTTP_REFERER'] 添加一个检查。此外,看起来它仍然应该根据您的文件夹结构工作,因为所有浏览器关心的是 index.php,它们位于站点根目录下的自己的文件夹中。
  • 不确定问题是什么...访问跨域的唯一方法是手动输入 URL domain1.nl/domain2,因此搜索引擎不会这样做,除非您错误地从一个域链接到您的应用程序中的另一个。检查引荐来源网址或进行preg_match('/domain1/',current_url()); 重定向将阻止用户跨域查看。
  • 嗯?不,他们不会。搜索引擎不只是在网站上为 URL 尝试随机字符串;搜索引擎——自其诞生以来——通过以下链接查找内容。无论如何,很高兴你解决了。
【解决方案2】:

嗯,通过 htaccess 似乎不可能做到整洁..

好吧,我“修复”了它。 我在 CodeIgniter index.php 中的修复:我用下面的代码替换了变量 $application_folder 的声明。

define('DOMAIN', preg_replace(
    "/^(www.|local.)?([^.]+).[^.]+$/i", "\\2",
    $_SERVER['HTTP_HOST']
));

if ( DOMAIN == 'domain2')
    $application_folder = '../application/domain2';
else
    $application_folder = '../application/domain1';

我还对系统“url_helper”做了一个小改动。添加了这个“static_url()”函数,返回URI到我保存图片/CSS/js等的路径

if ( ! function_exists('static_url'))
{
    function static_url()
    {
        return base_url().'static/'.DOMAIN.'/';
    }
}

我要弄清楚的唯一小事是如何拆分 robots.txt 之类的内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 2016-04-09
    • 2011-05-15
    • 2015-05-21
    • 2011-02-04
    • 2014-03-17
    相关资源
    最近更新 更多