我想在不使用硬编码url yii2的情况下从前端获取后端url

我想在不使用硬编码url yii2的情况下从前端获取后端url,yii2,yii2-advanced-app,yii-components,yii2-model,yii2-urlmanager,Yii2,Yii2 Advanced App,Yii Components,Yii2 Model,Yii2 Urlmanager,然后我想显示上传目录下保存的图像 'urlManagerBackend' => [ 'class' => 'yii\web\urlManager', 'baseUrl' => 'http://backend.test', 'enablePrettyUrl' => true, 'showScriptName' => true, ], 在config文件夹中应该有一个名为params.php的文

然后我想显示上传目录下保存的图像

'urlManagerBackend' => [
        'class' => 'yii\web\urlManager',
        'baseUrl' =>  'http://backend.test',
        'enablePrettyUrl' => true,
        'showScriptName' => true,
    ],

在config文件夹中应该有一个名为params.php的文件。如果你有这样的东西

'baseUrl' =>  'http://backend.test',
<?php

return [
    'adminEmail' => 'admin@example.com',
    'baseUrl' =>  'http://backend.test',
];
/uploads/logo.jpg>

然后,当您转到live时,只需编辑params.php文件。

注释太长,所以我需要将其放在这里

但我只是想知道在哪种情况下这是有意义的,除非你是通过你的应用程序创建web应用程序,网站,…,我怀疑你会这样做。 您知道您的本地域(使用本地环境并放置URL)。 您将了解您的开发域(使用开发环境并放置URL)。 您将了解您的生产域(使用prod环境并放置URL)

您也可以在yii2项目中拥有多个应用程序,例如, 跨越3个环境的10个应用程序,即您将在配置中输入的30个URL

你能告诉我,如果url是动态确定的->而不使用Yii以外的任何东西,你将如何访问你的应用程序吗

你的脚步是什么?你正在浏览器中键入什么?然后我们可以继续。也许我们彼此误解了

<img src="<?= Yii::$app->params['baseUrl']; ?>/uploads/logo.jpg>

如果您想知道还可以跨Yii2环境使用多个urlManagerBackend组件。就像和params一样。将其添加到config的多个对应位置。所以在特定的环境中,您只需在同一个文件中放置需要覆盖的key=>值。

您只需使用资产和别名即可:

如果您有一个
备份/web/uploads/
文件夹,其中保存了通过后端上传的图像,并且希望在前端显示这些图像

前端/assets/
中创建一个新的资产文件,我们称之为后端资产.php

urlManagerBackend' => [
    'class' => 'yii\web\urlManager',
    'baseUrl' =>  'http://backend.test',
    'enablePrettyUrl' => true,
    'showScriptName' => true,
]
现在我们可以很容易地显示一个文件,比如说
backend/web/uploads/somefile.jpg

<?php

    use frontend\assets\BackendAsset;
    $backend = BackendAsset::register($this);

?>

动态确定其他应用程序的域(例如前端的后端)的唯一方法是解析web服务器的配置文件

当前应用程序的域(您可以通过
Url::base(true)
)获得的域)由web服务器设置的请求头或变量确定。但这些仅适用于当前应用程序,不适用于任何其他应用程序,即使它们是同一项目的一部分

如果要解析web服务器的配置文件,则必须面对三大挑战:

  • 不同的web服务器对配置文件有不同的语法
  • 配置文件可能位于任何位置
  • 您可能没有读取配置文件的访问权限
  • 因此,与其坚持动态确定域,不如考虑一些变通方法

  • 创建一个请求后端域的部署脚本。将在生产服务器上部署您的应用程序的人将知道后端应用程序的域,并可以在部署过程中进入该域。然后,部署脚本将在配置文件中设置输入的后端域
  • 在后端创建一个在访问前端应用程序之前必须访问的页面。您可以在访问后端中的页面时确定后端的域,然后在前端配置文件中设置该域。如果在设置后端域之前访问前端,您将只显示必须首先访问后端页面的通知

  • 我通过在数据库中保存完整的url来解决这个问题。

    在前端服务器前面放一个reverseproxy(例如nginx)怎么样?
    可以按如下方式配置:

    http://frontend/backend/*
    ->将所有内容转发到后端服务,其余内容仍将转发到前端服务器

    此reverseproxy的配置(在本例中是后端服务器的位置)可以随时更改(也可以在部署后更改)


    这是一种可行的方案吗?

    您的意思是不能在配置中硬编码?您有不同的环境,可以根据环境设置不同的url。可能您有多个url?url“”是静态的,我无法在项目部署后使用它您有办法确定前端中的后端域吗?由于指向后端文件夹的域可以是任何内容,因此没有通用的方法来查找它。但是,如果您有某种方法来确定域(例如,您知道后端域将是
    后端.frontend-domain.example
    ),您应该能够在应用程序的中设置url管理器的baseUrl。此url“”是硬编码的,但我不能使用硬编码的url。然后,您将如何确定url@adnenmanssouri@Mike为什么要使用
    $this->redirect
    ,如果没有该功能,它也应该可以正常工作<代码>参数['baseUrl']。'/上传/logo.jpg';?>“/>Oops!!!谢谢Borisa,它被剪切和粘贴得很糟糕!!我已经编辑了我的答案。是的,没有使用$this->redirect@BorisaEric我不能使用“”,因为这是一个静态地址,我想要它是动态URL,问题现在仍然存在。我需要帮助Adnen-我对你对动态的定义感到困惑。我通常的想法是您可能有2个(或更多)URL的,比如backend.test和backend.live,每个都有自己的程序文件集。在这种情况下,我使用的方式会起作用。动态URL对您来说如何工作?这可以解决资产的问题。但资产并不都是您使用URL管理器的情况。例如,您可能需要创建链接或将用户重定向到后端应用程序OP特别提到他想“显示上传目录下保存的图像”(从后端,在前端)和“无硬编码URL”-我的建议就是这样。如果你
    <?php
    
       namespace frontend\assets;
       use yii\web\AssetBundle;
    
       class BackendAsset extends AssetBundle {
          public $sourcePath = '@backend/web/uploads';
       }
    
    <?php
    
        use frontend\assets\BackendAsset;
        $backend = BackendAsset::register($this);
    
    ?>
    
    <img src="<?= $backend->baseUrl . '/somefile.jpg' ?>" >
    
    'components' => [
        'assetManager' => [
            'linkAssets' => true,
            ]
        ]