将所有HTTP / HTTPS请求重定向到特定网站,然后返回

时间:2017-10-17 07:22:04

标签: apache redirect nginx

我想做什么(所有这些只在一个服务器上执行);

(我正在与example.com合作,不做任何广告)。

将所有传入的HTTP / HTTPS请求(端口80和443)重定向到特定网站,例如filter.example.com。在那里,我已经建立了自己的机制来过滤恶意请求。之后,请求应该返回到请求的网站。

我的问题是,每个请求都被重定向回过滤器,因此存在无限循环。

你知道任何解决方案或者替代方案(Nginx)吗?

以下是数据包流所显示的问题;

“用户 - 请求= https://example.com” - > “Apache将其重定向到= https://filter.example.com” - > “过滤后= https://example.com” - > “Apache再次将其重定向。”

我真的希望你能理解我的问题。

谢谢。

编辑:

这是我对filter.example.com ServerName;

的设置
<VirtualHost *:80>
    ServerName filter.example.com
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
    ServerName filter.example.com
    RewriteEngine On
    DocumentRoot /var/www/filter/
    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/filter.example.com/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/filter.example.com/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/filter.example.com/privkey.pem
    ErrorDocument 404 /error404.html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</VirtualHost>

这里是我的“真实”网站;

<VirtualHost *:80>
    ServerName example.com
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>

<VirtualHost *:443>
    ServerName example.com
    RewriteEngine On
    DocumentRoot /var/www/html/
    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    ErrorDocument 404 /error404.html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE application/xml
    AddOutputFilterByType DEFLATE application/xhtml+xml
    AddOutputFilterByType DEFLATE application/rss+xml
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</VirtualHost>

所以,大卫写道;

您将真正进入重定向循环,因为www.example.com的请求1将重定向到filter.example.com并再次无限地重定向到www.example.com。 为了避免这种情况,请在filter.example.com中为来自www.example.com的传入请求添加cookie /标头(当然,在完成过滤器过程之后),像Filter:true,因此您知道这已经是过滤后的请求,不需要去filter.example.com。

server {
    server_name filter.example.com;
    //logic to filter 
    add_header 'passed_filter' 'true'; 
}

如果您重定向逻辑以添加检查以验证标头Filter:true是否存在,如果不重定向到filter.example.com,如果是 - 跳过重定向并按照正常执行过程。

//If the header is not set, then we understand that this request should be redirected to filter.example.com
if($sent_passed_filter ~= 'true') {
   //logic to redirect to filter
}

是Nginx,因为我正在使用Apache。是否还有类似的解决方案,但对于Apache?

1 个答案:

答案 0 :(得分:1)

您最终会进入重定向循环,因为www.example.com的请求1将重定向到filter.example.com并再次无限地重定向到www.example.com。

为了避免这种情况,请在filter.example.com中为来自www.example.com的传入请求添加一个cookie /标头(当然,在完成过滤器过程之后),像Filter:true,所以你知道这已经是已过滤的请求,并且不需要访问filter.example.com。

server {
  server_name filter.example.com;
  //logic to filter 
  add_header 'passed_filter' 'true'; 
}

在重定向逻辑中添加一个检查以验证标头Filter:true是否存在,如果没有重定向到filter.example.com,如果是 - 跳过重定向并按照正常执行过程。

//If the header is not set, then we understand that this request should 
be redirected to filter.example.com
if($sent_passed_filter ~= 'true') {
   //logic to redirect to filter
}