使用apache

时间:2018-05-31 08:17:45

标签: apache redirect https

我将某个请求重定向到其他端口时遇到问题。这是我的配置:

  • 我有一个像XXXX.ddns.net
  • 这样的公共域名
  • 我有一个带有apache的Rapsbian服务器,我/ var / www文件夹中的文件正确提供(有角度的网站)
  • 在同一个Raspbian服务器上,有一个在3000端口上运行的REST服务器
  • 这是在使用SSL(letsencrypt)的HTTPS上运行

我希望将XXXX.ddns.net/api/*的所有请求重定向到3000端口。

我更改了.htaccess文件,重写规则似乎适用于本地但我无法通过我的网站工作。 API请求以500错误实现。

这是我当前的.htaccess文件:

RewriteEngine On
RewriteRule ^api/(.*)      https://localhost:3000/api/$1 [QSA]
# not sure if it should be http or https in the rule but nothing works
#RewriteRule ^api/(.*)      http://localhost:3000/api/$1 [QSA]

# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# If the requested pattern is file and file doesn't exist, send 404
RewriteCond %{REQUEST_URI} ^(\/[a-z_\-\s0-9\.]+)+\.[a-zA-Z]{2,4}$
RewriteRule ^ - [L,R=404]

这是我目前的000-default-le-ssl.conf文件(在/ etc / apache2 / sites-available中):

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

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

ServerName XXXX.ddns.net
SSLCertificateFile /etc/letsencrypt/live/XXXX.ddns.net/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/XXXX.ddns.net/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
<Location /api>
        ProxyPass http://127.0.0.1:3000/api
        ProxyPassReverse http://127.0.0.1:3000/api
</Location>

</VirtualHost>
</IfModule>

如果有人能帮助我实现它...... 谢谢!

2 个答案:

答案 0 :(得分:0)

感谢您的帮助。我真的不知道它现在怎么样了! 我不完全记得我做了什么,但最后一个是修改我的000-default-le-ssl.conf文件,如下所示:

SSLProxyEngine On
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
<Location /api>
    ProxyPass http://127.0.0.1:3000/api/
    ProxyPassReverse http://127.0.0.1:3000/api/
    ProxyPass https://127.0.0.1:3000/api/
    ProxyPassReverse https://127.0.0.1:3000/api/
</Location>

答案 1 :(得分:0)

你自己找到的解决方案对我来说很奇怪。您打开SSLProxyEngine,然后禁用所有安全措施。后端API是否在HTTPS和HTTP上同时在端口3000上运行?这是不可能的。

我经常使用此设置(apache作为后端应用程序的代理)并建议以下配置:

由于我不理解重写指令的目的,所以我把它们排除了。端口80上的VirtualHost始终将HTTP请求重定向到HTTPS。如果这样可以将permanent添加到指令中(永久性由某些浏览器缓存,请参阅VirtualHost *:80中的注释)。

VirtualHost for HTTPS提供来自/ var / www / html的DocumentRoot的内容。 Directory指令注意只提供正确寻址的文件(不可能查找)。 VirtualHost还在端口3000上的同一服务器上为/ api提供代理。

如果你的letsencrypt配置正确,它应该适用于apache 2.4(填写XXXX)。两个VirtualHost配置都可以写入单个文件,通常位于/ etc / apache2 / sites中,并且可以使用符号链接到/ etc / apache2 / sites-enabled。在测试此配置之前,请删除/重命名.htaccess文件和其他配置。如果您需要通过apache进行访问控制,也可以直接在VirtualHost配置中进行配置。

<VirtualHost *:80>
    ServerName XXXX.ddns.net
    # Always https
    Redirect / https://XXXX.ddns.net/
#    Redirect permanent / https://XXXX.ddns.net/
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName XXXX.ddns.net
    # These are your SSL settings; your responsibility
    SSLCertificateFile /etc/letsencrypt/live/XXXX.ddns.net/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/XXXX.ddns.net/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    # Your document root; where the JavaScript application lives
    DocumentRoot /var/www/html
    <Directory /var/www/html/ >
        Options -Indexes +FollowSymLinks -MultiViews
        AllowOverride None
        Order Allow,Deny 
        Allow From All
    </Directory>

    # Reverse proxy settings for api
    ProxyRequests     Off
    ProxyPreserveHost On
    <Location /api >
        ProxyPass        http://127.0.0.1:3000/api
        ProxyPassReverse http://127.0.0.1:3000/api
    </Location>
</VirtualHost>