使用 apache 在同一个域上托管两个应用程序,其中一个具有基本身份验证

使用 apache 在同一个域上托管两个应用程序,其中一个具有基本身份验证

我在设置时遇到麻烦apache

应用:

  • 应用程序 1 - SPA(前端),在 docker 中运行。可通过以下方式本地访问http://localhost:91

  • 应用程序 2 - WebAPI(后端服务),在 docker 中运行。可通过以下方式本地访问http://localhost:90

我想使用以下方式通过 HTTPS 使这两个应用程序在同一个域上可用apache

  • 应用1:https://my.domain.com <-应使用基本身份验证进行保护
  • 应用2:https://my.domain.com/api

当我使用纯 HTTP 访问资源时,我以为这个设置可以正常工作,但是一旦我切换到 HTTPS(self-signed使用letsencrypt)——一切似乎都停止了工作。

这是最新配置

<VirtualHost *:80>
    ServerName my.domain.com
    ServerAlias www.my.domain.com
    
    TraceEnable off

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =www.my.domain.com [OR]
    RewriteCond %{SERVER_NAME} =my.domain.com
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName my.domain.com
    ServerAlias www.my.domain.com

    TraceEnable off
    ProxyRequests Off
    ProxyPreserveHost On
    
    <Proxy *>
        Order deny,allow
        #Allow from all
        Allow from 127.0.0.1
    </Proxy>
    
    Timeout 2400
    ProxyTimeout 2400
    ProxyBadHeader Ignore 

    <Location />
        AuthType Basic
        AuthName "Restricted Content"
        AuthUserFile /etc/apache2/.htpasswd
        Require valid-user
        
        ProxyPass        http://localhost:91/ Keepalive=On
        ProxyPassReverse http://localhost:91/
    </Location>
    
    <Location /api>
        ProxyPass        http://localhost:90/
        ProxyPassReverse http://localhost:90/
    </Location>
    
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

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

最新的问题是:

每当我尝试访问端点时https://my.domain.com/api/Auth/Login,系统都会提示用户登录页面。这只对非 API URL 有效。

换句话说 -<Location /api>指令似乎被忽略了。我尝试过改变位置指令以及许多其他解决方案,但都不起作用。我还尝试过更明确的指令,但<LocationMatch /(api).*>同样失败了。

位置匹配规则有问题吗?

答案1

<Location /api>并没有被忽略,您只是没有为其配置身份验证,因此适用更高级别的配置。

禁用AuthType位置:

<Location /api>
    AuthType None
    Require all granted
    ProxyPass        http://localhost:90/
    ProxyPassReverse http://localhost:90/
</Location>

相关内容