我想在不使用硬编码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服务器的配置文件,则必须面对三大挑战:
我通过在数据库中保存完整的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,
]
]