Php 如何使用/web以外的web根目录部署Yi2

Php 如何使用/web以外的web根目录部署Yi2,php,.htaccess,yii2,yii-url-manager,Php,.htaccess,Yii2,Yii Url Manager,我正在处理一个yii2项目,并希望将其部署到一个apache服务器上,整个网站应该位于/public_html目录中,/public_html是该主机的web根目录。问题在于,yii2期望web根目录为/web,并且期望大多数站点层次结构存在于/web目录之外 我希望不必将webroot更改为/public\u html/web,对于未来的项目,这可能不是一个选项。那么,有没有一种方法可以将整个站点层次结构放置在/public_html中,并且仍然让站点正常工作 我已尝试创建具有以下内容的/pu

我正在处理一个yii2项目,并希望将其部署到一个apache服务器上,整个网站应该位于/public_html目录中,/public_html是该主机的web根目录。问题在于,yii2期望web根目录为/web,并且期望大多数站点层次结构存在于/web目录之外

我希望不必将webroot更改为/public\u html/web,对于未来的项目,这可能不是一个选项。那么,有没有一种方法可以将整个站点层次结构放置在/public_html中,并且仍然让站点正常工作

我已尝试创建具有以下内容的/public_html/.htaccess文件:

    RewriteEngine on
    RewriteCond %{REQUEST_URI} !web/
    RewriteRule (.*) /web/$1 [L]
起初,这似乎是正确的。无法访问/public_html/web之外的任何内容,也无法访问/web子目录中的文件,如/web/js/signup.js,这些文件可以通过url访问,但这导致我的路由规则(在本地系统上设置,我可以让web根指向/web)不再被识别

因此,我很乐意为.htaccess路由提供一个替代方案,或者建议如何修复路由规则,以便.htaccess路由能够工作

编辑以澄清

我有一个主机提供商,其中web根是~/public\u html。Yii的文档解释说,您可以将www重命名为public_html,并将通常在/www之外的所有内容都放在~,以及Linux通常放在~)中的各种点文件和用户文档。我更喜欢将所有与站点相关的目录放在一起(在webroot下)

作为替代方案,两个目录结构(如以下内容)将起作用:

~/
 |--- (Various dotfiles and subdirectories unrelated to the web site)
 |--- yii - Contains all subfolders that should be outside of the web root
      |--- commands
      |--- config
      |--- controllers 
      |--- (etc...)
 |--- public_html - Contains everything that can be within the web root.
      |--- (etc...)

这已经被问了很多次了,以至于他们在Yii2文档中对此做出了解释


我个人回答这个问题的次数太多了,记不得了。

这可以通过使用别名来实现

将您的web目录移动到新的webroot(假设~/mysite.com是您现有的站点):

然后,将webroot之外的所有内容移动到新目录:

mv -prf ~/mysite.com ~/mysite.example-external
此时,您应该在~/public\u html上有一个web根目录,并且应该在~/mysite.example-external中有其他所有内容。然后编辑~/public\u html/index.php文件。请注意,这不是yii核心的一部分,因此可以修改它。新指数应在以下方面有所变化:

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

$thepath = __DIR__ . '/../mysite.example-external';

require( $thepath . '/vendor/autoload.php');
require( $thepath . '/vendor/yiisoft/yii2/Yii.php');

$config = require( $thepath . '/config/web.php');

(new yii\web\Application($config))->run();

我已经读过几次那个页面,但它没有清楚地说明如何将所有源文件移动到web根目录中,因为不应该这样做。只有几个index.php文件应该在web根目录中,其余的应该在外部。安全特性。注意,对于这个最初属于的站点,我只是让外部文件混乱在主目录中。这是在一个测试站点上完成的,目的是看看是否可能。所有这些都有意义,但我不明白最后一行是如何实现的:(new yii\web\Application($config))->run();当index.php与其余部分分离时,将正常工作。服务器如何知道yii是什么?web.php文件中的别名表示yii应该用来查找webroot之外的文件的路径。为了实现这一点,我必须修改webroot中的index.php文件,从这个新根目录中引入“/vendor/autoload.php”、““/vendor/yiisoft/yii2/Yii.php”和“/config/web.php”文件,但从那时起,autoload应该知道如何搜索这个外部根目录。
<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

$thepath = __DIR__ . '/../mysite.example-external';

require( $thepath . '/vendor/autoload.php');
require( $thepath . '/vendor/yiisoft/yii2/Yii.php');

$config = require( $thepath . '/config/web.php');

(new yii\web\Application($config))->run();
$config = [
    'aliases'   => [
        'webroot/assets' => '/Users/XXXXXX/mysite.example-external/web/assets',
        'root' => '/Users/XXXXXX/mysite.example-external/web',
    ],