在共享服务器上部署时的 Yii2 基本应用程序 HtAccess 规则

Yii2 Basic App HtAccess Rules when deploying on shared server

我已经使用 yii2 基本应用程序建立了一个站点,在我的本地主机上一切正常,我只是通过从更新的 /public_html 文件夹的根目录 git 克隆 repo 来部署我的应用程序作曲家和 运行 迁移,在我添加

之后一切顺利

public_html/.htaccess

public_html/web/.htaccess

具有以下规则集的文件

public_html/.htaccess

<IfModule mod_rewrite.c>
    Options +SymLinksIfOwnerMatch
    RewriteEngine On
</IfModule>

<IfModule mod_rewrite.c>
    RewriteCond %{REQUEST_URI} ^/.*
    RewriteRule ^(.*)$ web/ [L]

    RewriteCond %{REQUEST_URI} !^/web/
    RewriteCond %{REQUEST_FILENAME} !-f [OR]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^.*$ web/index.php
</IfModule> 

public_html/web/.htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php

config/web.php 中的 UrlManager

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'baseUrl' => sprintf(
            "%s://%s", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME']
    ),
    'rules' => [
        '' => 'site/index',
        'tos' => 'site/tos',
        'privacy-policy' => 'site/privacy',
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        '<module:\w+>/<controller:\w+>/<action:\w+>' => '<module>/<controller>/<action>',
    ],
],

无论我做什么,我总是登陆主页 我在页脚条款和条件联系方式和隐私政策中有 3 个链接,它们都显示主页,尽管地址栏中显示的 url 是正确的 t 运行很高兴 UrlManager 是对的,但加载的视图始终是您的主页。

注意:我没有像 Yii2 指南所说的那样在 public_html 文件夹之外克隆 repo,而是在 public_html 中克隆了 git repo,我认为它不是不可行,因为高级应用程序如果克隆在 publich_html 内部而不是外部

也可以工作

Yii 2 Basic 应用程序必须按照文档中的描述放在 public_html 目录之外,您不能在 public_html 中设置,而是必须将 web 重命名为 public_html 然后将其克隆到 public_html 目录之外,以便它被重命名的文件夹 (web -> public_html) 内容覆盖。

您可以为此使用 symlinks。您可以将项目放在任何地方,并且只创建符号链接到您的主机强制目录。例如,将项目放入 ~/domains/example.com/project 并创建指向 public_html 目录的符号链接。

cd ~/domains/example.com
# remove old public_html directory
mv public_html old_public_html
# create symlink for webroot
ln -s ./project/web public_html

无需更改项目结构,也没有扭曲的重写规则。