GVKun编程网logo

我已经在NGINX服务器上部署了一个React App,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作

1

在本文中,我们将为您详细介绍我已经在NGINX服务器上部署了一个ReactApp,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作的相关知识,此外,我们还会提供一些关于7.app和app

在本文中,我们将为您详细介绍我已经在NGINX服务器上部署了一个React App,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作的相关知识,此外,我们还会提供一些关于7.app 和 app 后端的通讯、ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j、Android APP 卸载守护,双 APP 相互守护、Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示的有用信息。

本文目录一览:

我已经在NGINX服务器上部署了一个React App,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作

我已经在NGINX服务器上部署了一个React App,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作

如何解决我已经在NGINX服务器上部署了一个React App,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作?

我的react应用程序可以很好地调出主页。 / / mfi 都可以。但是 / mfi / superlonguuid 没有。我没有收到404错误,它显示空白页。当我在Nginx服务器之外运行React应用程序时,它运行良好。我已经尝试整整2天,并且做了很多谷歌搜索。我认为这可能是某种菜鸟错误,但老实说我不知道​​。

我一直在尝试的另一件事是将Nginx服务器日志设置为调试模式,以便我可以设法弄清楚如何解决上述问题,但是我也没有运气

我使用yarn build构建了我的react应用程序。我使用以下dockerfile构建了一个docker映像。

FROM Nginx:1.18
copY ./Nginx/Nginx.conf /etc/Nginx/conf.d/default.conf
copY build/ /usr/share/Nginx/html

上面的Quck摘要给那些不了解docker的人。这将创建一个带有Nginx服务器的linux操作系统,将以下配置文件复制到Nginx默认conf,然后将构建从我的react应用复制到Nginx html部分。

这是nxginx.conf文件

server { 
 listen 80;
 server_name mfi-ui;
 root /usr/share/Nginx/html;
 
 location / {
   # This would be the directory where your React app''s static files are stored at
   try_files $uri /index.html;
 }
 
 location /mfi-service {
   proxy_set_header X-Real-IP $remote_addr;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
   proxy_set_header X-Nginx-Proxy true;
   proxy_pass http://mfi-service/;
   proxy_ssl_session_reuse off;
   proxy_set_header Host $http_host;
   proxy_cache_bypass $http_upgrade;
   proxy_redirect off;
 }
}

编辑1: 好的,这似乎是我的问题,因为当它尝试调用其他内容(js文件,css文件等)时,它被重定向到index.html。 try_files $ uri应该不能抓住那些人?

拔起http:// localhost:31000 / mfi /时,它可以工作。当返回http:// localhost:31000 / mfi / superlonguuid index.html时,但没有从React端加载任何内容。当react应用程序在Nginx服务器外部运行时,此方法有效。

<Router>
    <div id="router-div">
        <Switch>
            <Route path="/mfi/:uuid">
                <MasterFileIndex />
            </Route>
            <Route path="/mfi">
                <MasterFileIndex />
            </Route>
            <Route path="/object-workspace">
               <ObjectWorkspace />
            </Route>
        </Switch>
    </div>
</Router>

对mfi-service的调用工作正常(通过从Nginx服务器卷曲,通过从基本URL加载时通过Web浏览器调用)。

Docker日志显示它正在通话。

在涉及打开调试模式的文档中,我遇到了错误Nginx-debug而不是命令。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

7.app 和 app 后端的通讯

7.app 和 app 后端的通讯

【转载】 作者:曾健生,公众号 IDappbackend

                 比目科技

 

经常有开发者问:app 和后端通讯是用 http 协议还是私有的协议?是用长连接还是短连接?通过阅读本文,帮你解除上面的疑问。

 

1)是用 http 协议还是私有的协议?

 

在间谍电视剧中,经常能看到间谍们的书信都是用暗号的,就算书信被敌人截取了不怕,需要耗费一定的时间,敌人才能解开书信中的秘密。

 

在电影 < 阿凡达 >, 为提升故事真实性,詹姆斯卡梅隆甚至找到语言学家,专为纳美人创造了一种自己的语言。我们看这部电影的时候,根本听不懂潘多拉星球上的纳美外星人到底说什么?纳美语共有大约 1000 个单词,全球能够掌握其语法的人只有创造这门语言的 PaulFrommer 教授一人,而且就算他本人也仍然在学习如何更流畅的说纳美语。

 

如果间谍们使用的都是大家都懂的中文,敌人截取到书信,就能立刻知道里面的内容。

 

如果潘多拉星球上的纳美外星人说的是中文,那么很多人一听就知道他们是说啥。

 

同样的,app 和后端的通讯,可以分为用通用的语言通讯,还是用暗语通讯两种方式。

 

通用的语言有很多种,例如英语和中文,在网络的通讯中,通用的协议有很多,其中 http 是被最广泛使用的。如果是私有的协议,那就只能自己设计了。

 

http 是最方便的,如果是私有协议,包含协议的封装和拆解,工作量大,前端程序员和后端程序员都要增加很多额外的工作量。而且私有协议对程序员的要求高,不适合从 web 网站转过来的开发者。除非是手游,不然用 http 就好了。

 

2app 和服务器通讯使用长连接还是短连接?

 

假设现在通过手机拨打另外一个人的手机,手机通话费用非常便宜(甚至可以忽略),但是有两个注意的地方:

1。一台手机同一时间只能接听一个电话。

2。一台手机接听电话前非常麻烦,要拨号啦,要等接听,这需要一段时间。

 

app 和服务器通讯使用长连接还是短连接这个问题,可以等同于上面电话模型,是一直保持着通话,还是有需要时才拨号通话这个问题?

 

app 和服务器通讯使用长连接,就相当于一直保持着通话,服务器能保持的通讯数量有限,如果通讯满了,那其他 app 就不能和服务端通讯了。这种通讯方式,多数是使用 socket websocket 连接长时间连接,对程序员的要求比较高,开发比较困难,除了手游和聊天推送服务外,不建议使用。

 

app 和服务器通讯使用短连接,就相当于需要时才拨号通话。这种通讯方式,配合 http 协议,是现在主流的通讯方式,开发效率高,有大量的第三方资源,使用非常广泛,推荐使用这种方式。

3app 和后端是怎么通讯的?

 

相信大家都用过银行的柜员机 (ATM) 的查询余额,转帐,取款等操作。

 

当在柜员机取款的时候,我们输入要取款的金额,隔一会钱就出来了,如果因为有什么问题不能取款(例如超过取款金额的限制),屏幕上也会显示出错误的信息。

 

在整个过程中,我们只要输入金额,获得结果(取款成功或不成功),就行了,至于柜员机内部是怎么处理,我们不需要理会。

 

柜员机这种把内部的处理遮蔽的做法极大方便了我们的使用。

 

同样的,在后端,也只提供了一系列的功能给 app 使用,这系列的功能以 api 的形式提供。

 

api 的定义:APIApplicationProgramming Interface, 应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

 

app 调用 api 的时候,只需要明确下面3点:

1。这个 api 是干啥的(柜员机例子中,是取款功能,还是查询余额 , 还是转账)

2。知道要输入什么(柜员机例子中,取款要输入金钱)

3。知道结果是什么(柜员机例子中,取款是成功还是失败)

 

至于 api 内部是怎么处理的,app 根本无需理会。

 

api,一般是以 http 的形式调用的,通过 http 传入参数,返回结果。其中,结果一般是以 json 格式返回的,因为 json 格式被众多计算机语言支持,而且省流量。

ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j

ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j

如何解决ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j

我正在Rails上执行此应用程序,页面加载正常,但在控制台中显示:

Started GET "/vendor/assets/stylesheets/bootstrap.min.css" for ::1 at 2020-08-17 09:09:51 -0500

Started GET "/vendor/assets/javascripts/bootstrap.min.js" for ::1 at 2020-08-17 09:09:51 -0500
ActionController::RoutingError (No route matches [GET] 
"/vendor/assets/stylesheets/bootstrap.min.css"):
ActionController::RoutingError (No route matches [GET] 
"/vendor/assets/javascripts/bootstrap.min.js"):

在我的供应商文件夹中,我同时拥有文件夹,javascript和样式表,并分别位于各自的bootsrtrap.min中。 即使在application.html.erb中,我也有以下内容:

  <link href="vendor/assets/stylesheets/bootstrap.min.css" rel="stylesheet">
  <%= csrf_Meta_tags %>
  <%= stylesheet_link_tag    ''application'',media: ''all'',''data-turbolinks-track'': ''reload'' %>
  <%= javascript_include_tag ''application'',''data-turbolinks-track'': ''reload'' %>

</head>
<body>

  <!-- Navigation -->
  <nav>
    <div>
      <ahref="#">Instagram Clone</a>
      <buttontype="button" data-toggle="collapse" data-target="#navbarResponsive" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
        <span></span>
      </button>
      <divid="navbarResponsive">
        <ul>
          <li>
            <ahref="#">Home
              <span>(current)</span>
            </a>
          </li>
          <li>
            <ahref="#">About</a>
          </li>
          <li>
            <ahref="#">Services</a>
          </li>
          <li>
            <ahref="#">Contact</a>
          </li>
        </ul>
      </div>
    </div>
  </nav>

  <!-- Page Content -->
  <div>
    <div>
      <div>
        <%= yield %>
      </div>
    </div>
  </div>

  <!-- Bootstrap core JavaScript -->
  <!--<script src="vendor/jquery/jquery.slim.min.js"></script>-->
  <script src="vendor/assets/javascripts/bootstrap.min.js"></script>
    
</body>
</html>

在js和CSS这两个应用程序文件中,我都放置了“ require bootsrtrap.min”,即使该错误仍然出现在控制台中。 会是什么?

解决方法

RoR不使用目录作为文件夹结构指示。因为有资产装载者。您应该将5s或更少的css导入application.css中,并将js导入application.js中。并使用自己的助手添加捆绑文件:

1。用纱安装靴子

yarn add bootstrap @popperjs/core jquery

npm i bootstrap @popperjs/core jquery

栏位不超过5

2。在Assets Pipeline中导入文件

app / assets / stylesheets / application.css:

//...
require bootstrap/dist/css/bootstrap.min
//...

但是,如果需要,我建议使用SCSS并仅导入所需的样式。

app / assets / javascript / application.js:

//...
//= require jquery
//= require @popperjs/core
//= require bootstrap/dist/js/bootstrap.min
//...

3。在布局中导入资产

app / views / layout / application.html.erb:

<head>
...
  <%= stylesheet_link_tag ''application'',media: ''all'' %>
</head>
<body>
...
  <%= javascript_include_tag ''application'' %>
</body>

使用webpack滚动6

2。在application.scss和application.js中导入Bootstrap

app / javascript / stylesheets / application.scss:

//...
import ''bootstrap''
//...

app / javascript / packs / application.js:

import ''jquery''
import ''popper.js''
import ''bootstrap''
import ''../stylesheets/application''

3。在布局中导入捆绑包

<head>
...
  <%= stylesheet_pack_tag ''application'',media: ''all'',''data-turbolinks-track'': ''reload'' %>
  <%= javascript_pack_tag ''application'',''data-turbolinks-track'': ''reload'' %>
</head>

之后,您应该可以在所有应用程序中使用引导程序!

,

[解决方案]因此,在我的HTML(application.html.erb)内部,我有两个对js和css文件的调用:

<script src="assets/javascripts/bootstrap.min.js"></script>
  <%= javascript_include_tag ''application'',''data-turbolinks-track'': ''reload'' %>       
<link href="assets/stylesheets/bootstrap.min.css" rel="stylesheet">
  <%= csrf_meta_tags %>
  <%= stylesheet_link_tag    ''application'',''data-turbolinks-track'': 
  ''reload'' %>

正如您在上面看到的那样,在使用javascript的情况下,我有一个使用脚本的调用,而另一个使用了的调用,两者都造成了问题,所以您只需要评论一个,我就对该脚本进行评论对于我的java文件和CSS文件,一个。 像这样:

  <!--<link href="assets/stylesheets/bootstrap.min.css" rel="stylesheet">-->
    <!--<script src="assets/javascripts/bootstrap.min.js"></script>-->

对我来说,解决了这个问题,我真的尝试了所有事情,这就是解决方案哈哈。

Android APP 卸载守护,双 APP 相互守护

Android APP 卸载守护,双 APP 相互守护

介绍一种当用户或者其他软件卸载你的应用时,其守护应用守护该应用重新安装至系统的方案。


方案缺点:

1、当具有 root 权限的删除时无法守护 (rm data/app/*.apk)

2、当为非 root 手机时,采用显示安装,用户可选择取消安装

方案优点:

1、使用传统手法卸载软件时具有 root 权限时可顽固守护

2、双应用守护,无法卸载其中任何一个


方案原理:

采用 BroadcastReceiver 接收拦截的应用卸载的消息,(由于系统原因,当接收到消息时,系统已经卸载了该应用才发出的消息,所以无法像短信拦截一样直接拦截)。

1、 接收到应用卸载信息

2、判断包名是否为需要守护的包名

3、如果是则启动重新安装

4、使用静默安装

5、如果失败使用普通安装


方案代码:

BroadcastReceiver

public class ProtectReceiver extends BroadcastReceiver {
	private static final String TAG = "ProtectReceiver";
	private String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
	private String PRO_APK_PATH = "/sdcard/test.apk"//需修改

	@Override
	public void onReceive(Context context, Intent intent) {
		if (ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
		        //需修改
			if ("package:com.rapida.test".equals(intent.getDataString())) {
				reInstallApp(context);
			}
		}
	}

	private void reInstallApp(Context context) {
		if (!installSlient(context, PRO_APK_PATH)) {
			install(context, PRO_APK_PATH);
		}
	}

	private void install(Context context, String filePath) {
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + filePath),
				"application/vnd.android.package-archive");
		i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.startActivity(i);
	}

	private boolean installSlient(Context context, String filePath) {
		String[] args = { "pm""install""-r", filePath };
		ProcessBuilder processBuilder = new ProcessBuilder(args);

		Process process = null;
		BufferedReader successResult = null;
		BufferedReader errorResult = null;
		StringBuilder successMsg = new StringBuilder();
		StringBuilder errorMsg = new StringBuilder();
		boolean result = false;
		try {
			process = processBuilder.start();
			successResult = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			errorResult = new BufferedReader(new InputStreamReader(
					process.getErrorStream()));
			String s;

			while ((s = successResult.readLine()) != null) {
				successMsg.append(s);
			}

			while ((s = errorResult.readLine()) != null) {
				errorMsg.append(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
			result = false;
		} catch (Exception e) {
			e.printStackTrace();
			result = false;
		} finally {
			try {
				if (successResult != null) {
					successResult.close();
				}
				if (errorResult != null) {
					errorResult.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (process != null) {
				process.destroy();
			}
		}

		if (successMsg.toString().contains("Success")
				|| successMsg.toString().contains("success")) {
			result = true;
		} else {
			result = false;
		}

		return result;
	}

添加权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

添加 receiver

<receiver android:name=".ProtectReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
</receiver>


程序应用:

在需要守护的应用里添加如上代码,因为是相互守护,需要在两个应用里都添加如上代码。


Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示

Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示

Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示

Android 实现不同 Launcher 桌面角标的坑 (Badge)

 

今天关于我已经在NGINX服务器上部署了一个React App,主页正常工作,其他页面正常工作,但是在刷新时,只有主页正常工作的分享就到这里,希望大家有所收获,若想了解更多关于7.app 和 app 后端的通讯、ActionController :: RoutingError没有路由与[GET]“ / vendor / assets / stylesheets / bootstrap.min.css”匹配 app / assets / stylesheets / application.css: app / assets / javascript / application.js: app / views / layout / application.html.erb: app / j、Android APP 卸载守护,双 APP 相互守护、Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示 Android 系统 应用图标显示未读消息数 (BadgeNumber) 桌面 app 图标的角标显示等相关知识,可以在本站进行查询。

本文标签:

上一篇“请求超时”代码=在Heroku中部署的H12 App Rails(请求超时,请重试(-1001))

下一篇重复的zip条目[classes.jar:android / support / v4 / app / INotificationSideChannel $ Stub $ Proxy.class]