簡體   English   中英

Express.js 應用程序向請求 url 添加額外的斜線

[英]Express.js app adding an extra slash to the request url

我在 Apache2 服務器上運行 express.js web 應用程序。 現在,該應用程序非常基本,我要做的就是將請求 URL 打印到控制台。 例如,當我在瀏覽器中訪問https://subdomain.example.com/node/something時,我希望它能夠將/something打印到控制台。 相反,它打印//something (注意開頭的額外斜杠)。 這意味着我編寫的任何路由處理程序都會被丟棄。 目前,我真的不知道是什么原因造成的。
可能相關的一點是我正在使用 Apache 的 mod_rewrite 來刪除 www。 在 URL 的開頭,以及從結尾的文件擴展名(.php 等)。 我試過評論這些,看看這是否會改變它,但它沒有。

我的應用程序:

const express = require('express');

const PORT = 8080;
const app = express();

app.use((req, res) => {
    console.log(req.url);
    res.status(200).send()
});

app.listen(PORT, () => {
    console.log(`App listening on port ${PORT}`)
})

我的 Apache 虛擬主機配置:

<IfModule mod_ssl.c>
<VirtualHost *:443>

        Alias /fonts /usr/share/fonts/www

        <Directory "/fonts">
                Require all granted
        </Directory>

        <Directory "/errors">
                Require all denied
        </Directory>

        <Directory "/">
                DirectoryIndex login.php
        </Directory>

        ServerName admin.example.com
        ServerAlias www.admin.example.com

        DocumentRoot /var/www/admin.example.com
        ErrorDocument 403 /errors/nope.html
        ErrorDocument 404 /errors/nope.html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        LogLevel alert rewrite:trace6

        ProxyRequests Off
        ProxyPreserveHost On
        ProxyVia Full

        <Proxy *>
                Require all granted
        </Proxy>

        <Location /node>
                ProxyPass http://127.0.0.1:8080/
                ProxyPassReverse http://127.0.0.1:8080/
        </Location>

        RewriteEngine On

        RewriteCond %{HTTP_HOST} ^www\.admin\.example\.com$
        RewriteRule ^/(.*)$ http://admin.example.com/$1 [R=301,L]

        RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
        RewriteRule ^(.+)/$ $1 [R=301]

        RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME}\.php -f
        RewriteRule (.*) $1.php

        RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
        RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} -f
        RewriteCond %{REQUEST_URI} ^(.+)\.php$
        RewriteRule (.*)\.php$ $1 [R=301,L]

        Include /etc/letsencrypt/options-ssl-apache.conf
        SSLCertificateFile /etc/letsencrypt/live/admin.example.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/admin.example.com/privkey.pem
</VirtualHost>
</IfModule>

任何幫助將非常感激。

更新:我將 .js 文件從 /node 文件夾移到 Apache 站點的根目錄中,這以某種方式解決了這個問題。 但是,我仍然希望能夠將其移動到文件夾中而不會出現問題。

apache 不太好,但是如果你從RewriteRule ^/(.*)$ http://admin.example.com/$1 [R=301,L]

而是讓它讀取RewriteRule ^/(.*)$ http://admin.example.com$1 [R=301,L]

Express 也喜歡在不需要的時候添加 /,所以我通過在不需要的地方刪除它們來解決這個問題。

不過,把這個和一粒鹽一起吃。 就像我說的,我不太習慣 Apache,而且我只使用 express 一年左右,所以這兩個都可能完全錯誤。

我的文件夾結構是這樣的:

項目
---- index.php
---- 節點
-------- main.js

通過在 vhost 配置中更改它來修復:

<Location /node>
       ProxyPass http://127.0.0.1:8080/node
       ProxyPassReverse http://127.0.0.1:8080/node
</Location>

暫無
暫無

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

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