【问题标题】:Node JS server on Shared Hosting - on a specific port using .htaccess共享主机上的节点 JS 服务器 - 在使用 .htaccess 的特定端口上
【发布时间】:2020-02-07 05:59:26
【问题描述】:

我似乎终于找到了一个 .htaccess 代码 sn-p,它可以在共享主机的非 :80 端口上运行 Node JS 服务器。

来自https://medium.com/@mayomi1/how-to-host-a-node-js-app-on-shared-host-52e12a62a259

#Open Port
RewriteRule ^$ http://127.0.0.1:XXXX/ [P,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://127.0.0.1:XXXX/$1 [P,L]

似乎工作正常,除了它重新路由所有流量,端口:80 包括到节点服务器:XXXX

我的 .htaccess 中有一些额外的行,一个用于将 http 转换为 https,另一个用于处理不存在的路径(转到 /specificsubfolder/,将路径的不存在部分作为哈希传递)

RewriteEngine On
RewriteBase /specificsubfolder/
#http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]
#redirect non-existant path
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ \#$1 [L,R=301,NE]

我希望做什么(我对 .htaccess 的掌握非常有限):

端口 :80 上的流量 -- 忽略 Node JS 服务器,并进行重新路由/哈希处理

端口 :XXXX 上的流量 -- 忽略上面的端口 80 重新路由。通过节点服务器处理。

【问题讨论】:

  • 您的 .htaccess 仅适用于在端口 80 或 443 上发送的请求,因为这是 Apache 正在侦听的地方。如果你的 Node 服务器监听端口 XXXX,并且你直接向端口 XXXX 发出请求 - 那么你还需要重写或代理什么?
  • 我试图解决的问题:这是一个共享主机环境,您无法打开任何端口。 Node 服务器可能正在侦听,但端口未打开。目标是使用 .htaccess 来撬开该端口。到目前为止,我已经取得了一些成功(不是上面的代码——只是在测试 .htaccess 打开端口的能力)。不幸的是,我对 .htaccess 的理解仍然非常有限,我几乎不明白每一行的含义。

标签: node.js .htaccess shared-hosting


【解决方案1】:

回答我自己的问题。同样,仍在学习.htaccess,目前几乎不理解代码位的含义,但这里有一个解决方案,上面提出的问题似乎有效(这里的目标是让一个.htaccess 文件处理许多事情一种防止它们相互矛盾的方法):

RewriteEngine On
RewriteBase /specificsubfolder/

#http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

#trigger that requests to a nonexistent file called 'srvr'
#opens port XXXX re-routes traffic to the node server listening there.
RewriteCond %{REQUEST_FILENAME} srvr
RewriteRule ^(.*)$ http://127.0.0.1:XXXX/$1 [P,L]

#redirect for all non-existant paths other than to 'srvr'
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ \#$1 [L,R=301,NE]

【讨论】:

  • 您检查REQUEST_FILENAME 的条件不“看起来”对吗?它与请求的 URL 映射到的文件系统路径中的 srvr anywhere 匹配。您可能应该匹配更具体的 URL 路径。您想将哪些 URL 转发到您的 NodeJS 服务器?
  • Thx MrWhite -- 我的假设是%{REQUEST_FILENAME} 将搜索限制为 URL 的实际文件名,而不是文件夹路径,并且因为它位于“特定子文件夹”中,所以它只影响从该点开始的目录下。我说对了吗?对于这个特定的问题,我实际上对将路径转发到节点服务器并不感兴趣——我很高兴将 POST 数据传递给它。目标是在不允许您打开自定义端口的共享托管环境中打开该服务器的端口。
  • REQUEST_FILENAME 服务器变量包含请求映射到的绝对文件系统路径(不仅仅是文件名)。例如,如果您请求example.com/path/to/file.html(作为物理文件存在)并且您的文档根是/var/www/user/public_html,那么REQUEST_FILENAME 将包含/var/www/user/public_html/path/to/file.html。但是,如果您请求example.com/foo/bar/baz.html(其中/foo/bar/baz.html 完全是虚拟的),那么REQUEST_FILENAME 将包含/var/www/user/public_html/foo(可能与预期不太一样)。
  • 您的情况在您的场景中可能工作正常,只是用法不寻常。如果srvr 出现在文档根目录上方的文件系统路径中的任何位置,那么无论请求的 URL 是什么,条件都将始终成功。我怀疑更具体的/srvr$ 也是正确的并且不容易出错? RewriteCond %{REQUEST_URI} ^/srvr$ 也一样吗? “我实际上对将路径转发到节点服务器并不感兴趣” - 尽管您似乎确实使用 $1 反向引用来执行此操作。 (?)
  • RE:“服务器变量包含绝对文件系统路径...” - 太棒了。感谢您澄清并提供有关这些怪癖的解释器。有没有办法获取 htaccess 使用的变量并传递它们——比如将它们作为数据添加到 POST 数据中,如果只是为了更容易地了解 htaccess 的操作方式?
猜你喜欢
  • 2018-02-26
  • 2018-08-02
  • 2011-08-13
  • 1970-01-01
  • 2011-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多