我正在尝试在我的ISP的站点上启动我的Web应用程序。在此解释中,该网站的网址将为"dev.domain.com"。我从网络风暴上传了该项目。该项目是按照feathersjs的"您的第一个应用程序"文档从头开始构建的。
上传后,我仍然拥有ISP提供的默认apache网页。原因:索引.html是公开的。所以我所做的就是用这个内容做一个.htaccess。
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} /public/([^s?]*) [NC]
RewriteRule ^ %1 [L,NE,R=302]
RewriteRule ^((?!public/).*)$ public/$1 [L,NC]
现在应用程序正在加载。然后我遇到了找不到socket.io.js的问题。这是由索引.html文件中的这一行引起的
<script src="socket.io/socket.io.js"></script>
所以我搜索了一个解决方案,并在'node-modules\socket.io-client\dist'目录中找到了socket.io.js。我将其复制到"assets\scripts\js",并将上面的链接调整到该文件夹。随着"npm start",一切仍在工作。
另外,由于我记得"config\default.json"具有特定信息,因此我也对其进行了更改以匹配(我还不知道如何触发production.json)。那里的服务器现在也是"dev.domain.com",端口更改为 80。
当我现在访问我的网站时,它会加载,但尚未收集任何数据,并且仍然有来自"http://dev.domain.com/socket.io/?EIO=3&transport=...."的 404 个错误。
问题
需要做些什么来解决最后一部分?
解决
所以,我发现应用程序没有连接到套接字,这很明显,但如果你没有连接,那么调用当然会失败。我把这个代码放在我的"应用程序.js中以验证连接
const socket = io.connect('http://dev.domain.com);
alert(socket.connected);
它返回假。url 与 default.json 中的服务器名称相同,因此现在最好查看套接字是否正在侦听。
因此,我尝试了一种"肮脏"的方法,只是为了看看它是否有效。我制作了文件夹"public\socket.io"并将"socket.io.js"放入其中。然后它带来了一个访问错误,我通过在".htaccess"中添加"+索引"来解决它会导致日志中出现此消息
[Sun Mar 19 15:11:19 2017] [error] [client 77.174.123.8] ModSecurity: Access denied with code 501 (phase 2). Match of "rx (?:^(?:application\\/x-www-form-urlencoded(?:;(?:\\s?charset\\s?=\\s?[\\w\\d\\-]{1,18})?)??$|multipart/form-data;)|text/xml)" against "REQUEST_HEADERS:Content-type" required. [file "/etc/httpd/modsecurity.d/modsecurity_crs_30_http_policy.conf"] [line "69"] [id "960010"] [msg "Request content type is not allowed by policy"] [severity "WARNING"] [tag "POLICY/ENCODING_NOT_ALLOWED"] [hostname "dev.domain.com"] [uri "/socket.io/"] [unique_id "WM6Rh1TxsZYAAegdFkkAAAAU"]
暂时离开这种方法,寻找不同的路线。
我的ISP不允许托管此类内容。所以我正在结束这个问题。我将自己托管它,或者获得一个确实可以选择的托管商或获取托管的 docker 映像。