簡體   English   中英

node.js 應用程序端點在 apache wordpress 網站后面

[英]node.js app endpoints behind apache wordpress website

我有一個在共享托管服務器上運行的 WordPress 網站 (mywebsite.com)。 此外,我還制作了一個 node.js 應用程序,該應用程序在端口 3000 的后端運行,該應用程序已被編程為具有不同的 API 端點。

我希望端點與特定 URL 中的網站位於同一域中。

已在 node.js 選擇器環境中聲明的主端點可以正常工作。 我們稱之為mywebsite.com/myapp 其他端點(已在快速路由中聲明)在網站環境之外正常工作,但如果我嘗試在同一個域上訪問它們,即使是 sub-uri,也會被 apache/wordpress 捕獲。

例如,如果我嘗試訪問mywebsite.com/secondendpointmywebsite.com/myapp/thirdendpoint ,請求會被加載 404 頁面的 Wordpress 捕獲。

現在,我知道我必須指示 apache 服務器將請求重定向到上述 URL 到 node.js 應用程序。 只要我無法訪問 apache 服務器,我就必須調整 .htaccess 文件的唯一選擇。

當我創建 node.js 應用程序時,虛擬環境已通過 .htaccess 文件自動設置在我的網站公共文件夾中自己的子文件夾中,我的整個網站是: /public_html/myapp 它使用 Phusion Passenger 來處理應用程序運行的虛擬環境。

# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION BEGIN
PassengerAppRoot "/home/user/apps/myapp"
PassengerBaseURI "/myapp"
PassengerNodejs "/home/user/nodevenv/apps/myapp/12/bin/node"
PassengerAppType node
PassengerStartupFile app.js
PassengerAppLogFile "/home/user/logs/myapp.log"
# DO NOT REMOVE. CLOUDLINUX PASSENGER CONFIGURATION END

上面的代碼工作得很好。 我嘗試按照一些教程中的建議添加別名:

# DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION BEGIN
<IfModule Litespeed>
SetEnv Alias /secondendpoint /apps/secondendpoint
</IfModule>
# DO NOT REMOVE OR MODIFY. CLOUDLINUX ENV VARS CONFIGURATION END

在 /public_html/ 的根目錄中,我有以下 .htaccess 文件

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^/secondendpoint/(.*)?$ http://127.0.0.1:3000/secondendpoint/$1 [P,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

無論我嘗試什么,當我嘗試訪問 mywebsite.com/secondendpoint 時,我總是收到 Wordpress 404 消息。

我究竟做錯了什么?

我什至嘗試在 /public_html/secondendpoint 中創建一個實際上代理流量的子文件夾,但我覺得這不是正確的方法。

因此,經過一周的嘗試,我發現 RewriteRule 的語法對於我想要實現的目標確實是錯誤的。

RewriteRule ^/secondendpoint/(.*)?$ http://127.0.0.1:3000/secondendpoint/$1 [P,L]

正確的語法是

RewriteRule ^secondendpoint(.*)$ http://127.0.0.1:3000/secondendpoint/$1 [P,L]

如 .htaccess 文件的注釋所示“只能通過 WordPress 過濾器進行修改”。 事實上,它確實會在每次更新時自動覆蓋我編寫的規則。

正確的方法是調整內部 WordPress WP_Rewrite 我仍在嘗試理解。

我最好的嘗試是添加到我的主題的 functions.php 這些行:

function wpd_wtf_rewrite_rule() {
    add_rewrite_rule(
        'secondendpoint(.*)$',
        'http://127.0.0.1:3000/secondendpoint$1',
        'top'
    );
}
add_action( 'init', 'wpd_wtf_rewrite_rule' ); 

這些行被翻譯成

RewriteRule ^secondendpoint(.*)$ /http://127.0.0.1:3000/secondendpoint$1 [QSA,L]

並更新到 .htaccess 文件中。

目標前面的斜線是我不知道如何解決的問題。 但是,生成的 .htaccess 字符串不會代理請求,從而導致來自 API 的錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM