如何让 cordova 允许从与我的网络应用程序相同的主机通过 https 下载 pdf?
How to get cordova to allow a pdf to be download over https from the same hosting as my web app?
我在 android 上有一个基本的 cordova 应用程序 运行,可以在网络视图中加载我的主要网络应用程序。
当 运行 我的 Web 应用程序通过 cordova 时,它不会通过 https 下载与我的应用程序位于同一托管订阅中的任何 pdf。
通过 https 从其他网站下载 pdf 工作正常 - 包括同一服务器上的其他托管订阅。
无论在何处托管,都可以通过 http 下载 pdf 文件。
所有其他文件(包括 txt 文件)无论托管在何处(通过 http 或 https)都可以正常下载。
示例:
https://mywebsite.com/test.txt(可以下载)
https://mywebsite.com/test.pdf(不下载)
http://mywebsite.com/test.pdf(可以下载)
https://anyanotherwebsite.com/test.txt(可以下载)
https://anyanotherwebsite.com/test.pdf(可以下载)
http://anyanotherwebsite.com/test.pdf(可以下载)
我的代码:
这是我的 cordova "index.html" 文件:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div class="app">
<p>Loading</p>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
这是我的 cordova "index.js" 文件:
var app = {
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},
onDeviceReady: function() {
var targetUrl = "https://cordova1.mydevelopmentserver.com/";
window.location.replace(targetUrl);
},
};
app.initialize();
这是我的 cordova "config.xml" 文件:
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.company_name.someid" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>My Awesome App</name>
<author email="dev@cordova.apache.org" href="http://cordova.io">Apache Cordova Team</author>
<content src="index.html" />
<preference name="SplashScreen" value="screen" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
<allow-navigation href="https://*.cordova1.mydevelopmentserver.com/*" />
<allow-navigation href="file://*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
<preference name="ShowTitle" value="True" />
<preference name="Fullscreen" value="False" />
<plugin name="cordova-plugin-device" spec="^2.0.1" />
<engine name="android" spec="^7.0.0" />
</widget>
也尝试将 config.xml 设置更改为以下但仍然不起作用:
<access origin="*" />
<allow-navigation href="*" />
<allow-intent href="*" />
下载示例 CORDOVA 项目:
https://drive.google.com/file/d/1Z3TZudstF5WqquW6M-bv-8cit3nUFNcI/view?usp=sharing
示例 cordova 项目重定向到 https://cordova1.mydevelopmentserver.com which contains the following html file which can be used to test the issue. I have also setup https://cordova2.mydevelopmentserver.com 完全相同并且该域仍然存在问题。
<!DOCTYPE html>
<html>
<head>
<!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;"> -->
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<title>Hello World</title>
</head>
<body>
<p><a href="https://cordova1.mydevelopmentserver.com/test.txt">https://cordova1.mydevelopmentserver.com/test.txt</a></p>
<p><a href="https://cordova1.mydevelopmentserver.com/test.pdf">https://cordova1.mydevelopmentserver.com/test.pdf</a></p>
<p><a href="http://cordova1.mydevelopmentserver.com/test.pdf">http://cordova1.mydevelopmentserver.com/test.pdf</a></p>
<hr>
<p><a href="https://cordova2.mydevelopmentserver.com/test.txt">https://cordova2.mydevelopmentserver.com/test.txt</a></p>
<p><a href="https://cordova2.mydevelopmentserver.com/test.pdf">https://cordova2.mydevelopmentserver.com/test.pdf</a></p>
<p><a href="http://cordova2.mydevelopmentserver.com/test.pdf">http://cordova2.mydevelopmentserver.com/test.pdf</a></p>
</body>
</html>
其他注意事项:
我认为这不是服务器的问题,因为同一服务器上另一个网站的 pdf 链接工作正常。
我认为这不是 SSL 证书的问题,因为使用相同 SSL 的其他托管订阅链接工作正常。
我是 cordova 的新手,但我认为这可能是我配置的某个地方存在问题,但我已经尽可能多地删除了配置。
科尔多瓦版本:7.0
Android版本:7.0
Phone:三星 S8+
还在 Samsung S4 运行 Android 5.0.1 上测试过,但有同样的问题。
使用您的示例,我可以重现您的问题,它看起来与使用 WebView 有关。如果我使用 InAppBrowser,我可以通过 https 正常打开 PDF(无论它们在哪里)。
希望您至少可以使用 InAppBrowser,直到找到合适的解决方案。
如果您确定 SSL 有效性,请尝试正确设置 内容安全策略 或 cordova allow origin[= 白名单插件的 34=]:https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/
如果怀疑 SSL 证书无效,请看这里:http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
根据我的经验,我认为是某种与从 cordova webview 信任您的证书有关的问题,在上面 link 您可以尝试实施 onReceivedSslError 处理并查看如果 SSL 证书有问题。
尝试在此处测试您的 SSL 证书以确保它没有问题:https://www.ssllabs.com/ssltest/
在握手模拟报告中,您可以验证许多移动平台和网络视图版本以检查证书是否可信。
希望对您有所帮助。
我在 android 上有一个基本的 cordova 应用程序 运行,可以在网络视图中加载我的主要网络应用程序。
当 运行 我的 Web 应用程序通过 cordova 时,它不会通过 https 下载与我的应用程序位于同一托管订阅中的任何 pdf。
通过 https 从其他网站下载 pdf 工作正常 - 包括同一服务器上的其他托管订阅。
无论在何处托管,都可以通过 http 下载 pdf 文件。
所有其他文件(包括 txt 文件)无论托管在何处(通过 http 或 https)都可以正常下载。
示例:
https://mywebsite.com/test.txt(可以下载)
https://mywebsite.com/test.pdf(不下载)
http://mywebsite.com/test.pdf(可以下载)
https://anyanotherwebsite.com/test.txt(可以下载)
https://anyanotherwebsite.com/test.pdf(可以下载)
http://anyanotherwebsite.com/test.pdf(可以下载)
我的代码:
这是我的 cordova "index.html" 文件:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<div class="app">
<p>Loading</p>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
这是我的 cordova "index.js" 文件:
var app = {
initialize: function() {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},
onDeviceReady: function() {
var targetUrl = "https://cordova1.mydevelopmentserver.com/";
window.location.replace(targetUrl);
},
};
app.initialize();
这是我的 cordova "config.xml" 文件:
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.company_name.someid" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>My Awesome App</name>
<author email="dev@cordova.apache.org" href="http://cordova.io">Apache Cordova Team</author>
<content src="index.html" />
<preference name="SplashScreen" value="screen" />
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
<allow-navigation href="https://*.cordova1.mydevelopmentserver.com/*" />
<allow-navigation href="file://*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
<preference name="ShowTitle" value="True" />
<preference name="Fullscreen" value="False" />
<plugin name="cordova-plugin-device" spec="^2.0.1" />
<engine name="android" spec="^7.0.0" />
</widget>
也尝试将 config.xml 设置更改为以下但仍然不起作用:
<access origin="*" />
<allow-navigation href="*" />
<allow-intent href="*" />
下载示例 CORDOVA 项目: https://drive.google.com/file/d/1Z3TZudstF5WqquW6M-bv-8cit3nUFNcI/view?usp=sharing
示例 cordova 项目重定向到 https://cordova1.mydevelopmentserver.com which contains the following html file which can be used to test the issue. I have also setup https://cordova2.mydevelopmentserver.com 完全相同并且该域仍然存在问题。
<!DOCTYPE html>
<html>
<head>
<!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;"> -->
<meta name="format-detection" content="telephone=no">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
<title>Hello World</title>
</head>
<body>
<p><a href="https://cordova1.mydevelopmentserver.com/test.txt">https://cordova1.mydevelopmentserver.com/test.txt</a></p>
<p><a href="https://cordova1.mydevelopmentserver.com/test.pdf">https://cordova1.mydevelopmentserver.com/test.pdf</a></p>
<p><a href="http://cordova1.mydevelopmentserver.com/test.pdf">http://cordova1.mydevelopmentserver.com/test.pdf</a></p>
<hr>
<p><a href="https://cordova2.mydevelopmentserver.com/test.txt">https://cordova2.mydevelopmentserver.com/test.txt</a></p>
<p><a href="https://cordova2.mydevelopmentserver.com/test.pdf">https://cordova2.mydevelopmentserver.com/test.pdf</a></p>
<p><a href="http://cordova2.mydevelopmentserver.com/test.pdf">http://cordova2.mydevelopmentserver.com/test.pdf</a></p>
</body>
</html>
其他注意事项:
我认为这不是服务器的问题,因为同一服务器上另一个网站的 pdf 链接工作正常。
我认为这不是 SSL 证书的问题,因为使用相同 SSL 的其他托管订阅链接工作正常。
我是 cordova 的新手,但我认为这可能是我配置的某个地方存在问题,但我已经尽可能多地删除了配置。
科尔多瓦版本:7.0
Android版本:7.0
Phone:三星 S8+
还在 Samsung S4 运行 Android 5.0.1 上测试过,但有同样的问题。
使用您的示例,我可以重现您的问题,它看起来与使用 WebView 有关。如果我使用 InAppBrowser,我可以通过 https 正常打开 PDF(无论它们在哪里)。
希望您至少可以使用 InAppBrowser,直到找到合适的解决方案。
如果您确定 SSL 有效性,请尝试正确设置 内容安全策略 或 cordova allow origin[= 白名单插件的 34=]:https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/
如果怀疑 SSL 证书无效,请看这里:http://ivancevich.me/articles/ignoring-invalid-ssl-certificates-on-cordova-android-ios/
根据我的经验,我认为是某种与从 cordova webview 信任您的证书有关的问题,在上面 link 您可以尝试实施 onReceivedSslError 处理并查看如果 SSL 证书有问题。
尝试在此处测试您的 SSL 证书以确保它没有问题:https://www.ssllabs.com/ssltest/
在握手模拟报告中,您可以验证许多移动平台和网络视图版本以检查证书是否可信。
希望对您有所帮助。