好吧,我已经花了一整天的时间——
我正在使用带有 mod_ssl 的 apache 我正在尝试采用一个现有的环境标头“%{SSL_CLIENT_S_DN_CN}s”,它看起来像“Lastname Firstname Mi username”并设置一个名为 USERNAME 的新标头并将其设置为仅等于 username(最后一个空格和字符串末尾之间的字符)
然后我将该标头反向代理到后端主机,后端主机将使用它来识别用户。
我尝试了很多不同的东西。我不知道问题是我不理解 perl 正则表达式,还是我不理解语法,或者我没有把它放在正确的地方,或者三者兼而有之。
这是我尝试过的一件事的示例:
SetEnvIf SSL_CLIENT_S_DN_CN (.*\ )(.*) newhostname=$2
RequestHeader set HOSTNAME "%{newhostname}e"
Run Code Online (Sandbox Code Playgroud)
我真正想要的是一个新的标头主机名,它等于 DN_CN 环境变量中的最后一个非空白字符。
我正在尝试将 www.contoso.com/blog/ 重写为 wordpress Azure 网站 (contosoblog.azurewebsites.net)。我已经完全配置了所有入站和出站规则,并在开发机器上本地测试了它们并且可以确认它有效——例如设置 www.contoso.com 以指向主机中的 127.0.0.1,点击 www.contoso.com/ blog/ 并可以确认它加载了 wordpress 站点。
我按照网络上的说明使用启动任务在 Azure 云服务中安装了 WebFarm Framework + ARR,并远程连接到实例,我可以看到 WFF 和 ARR 已正确安装。使用与我应用于开发环境相同的重写规则配置站点,当我点击 www.contoso.com/blog/ 时出现 404 错误。我想我得到 404 的唯一方法是如果没有发生重写,所以我点击了失败的请求跟踪并查看日志,我看到重写规则确实被命中并且 URL 正在被重写,但在中间的某个地方日志中有一个 ARR_WEBFARM_NOT_ROUTED 错误,URL 随后被重写回原始请求。
我到处搜索,ARR_WEBFARM_NOT_ROUTED 似乎只生成 1-2 页的 Google 结果,没有任何有用的信息。我有一种预感,它与云服务的配置方式有关,所以我启动了一个新的 Azure 虚拟机,配置了一个 IIS 角色并设置了 WebFarm+ARR。在该服务器上,一切正常。
有人可以指出我如何解决问题的正确方向,或者甚至可能吗?
我以这种方式将 NGINX 设置为两个 Domino 服务器的负载平衡器:
http {
upstream www.mydomain.com {
server 1.1.1.1;
server 2.2.2.2 backup;
}
server {
listen 80;
server_name www.mydomain.com;
location / {
proxy_pass http://www.mydomain.com;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我直接访问 Domino 服务器,响应头是这些:
HTTP/1.1 200 OK
Server: Lotus-Domino
Date: Mon, 23 Dec 2013 12:19:36 GMT
Last-Modified: Fri, 20 Dec 2013 08:16:27 GMT
Content-Type: text/html; charset=US-ASCII
Content-Length: 12713
Cache-control: private
ETag: W/"MTAtODEwRC1DMjI1N0MzRDAwN0M3NTBCLUMyMjU3QzQ3MDAyRDczMzktMC1DTj1QYW51IEhhYXJhbW8vTz1BQUQ="
Run Code Online (Sandbox Code Playgroud)
当我通过 NGINX 访问同一页面时,响应头是这些:
HTTP/1.1 200 OK
Server: nginx/1.0.15
Date: Mon, 23 Dec 2013 12:02:29 GMT
Content-Type: text/html; charset=US-ASCII
Connection: …Run Code Online (Sandbox Code Playgroud) 我使用 apache 作为 ruby on rails 应用程序服务器的反向代理。当使用非标准 HTTP 方法接收 HTTP 请求时,这会导致应用服务器中出现错误,从而暴露有关环境的一些(次要)详细信息。除非 HTTP 方法与安全的标准方法之一匹配,否则我可以阻止 apache 转发请求吗?
[编辑]
使用 Shane 的回答作为指导,我想出了以下内容,在此发布以供参考。
RewriteCond %{REQUEST_METHOD} !^(GET|HEAD|POST|OPTIONS)
RewriteRule .* - [R=405,L]
Run Code Online (Sandbox Code Playgroud)
我发现否定检查更容易,允许 apache 返回正确的响应代码(405 是不允许的方法),并且意味着所有代理配置内容都没有改变(即您可以使用 ProxyPass 或 ProxyPassMatch)
我在 CentOS6.5 服务器上使用 GitLab Omnibus。
gitlab nginx 服务器监听 6543 端口(Apache 已经在使用 80 和 443)。
我想使用 Apache 作为反向代理来访问具有该地址的 GitLab: gitlab.example.com 而不是 example.com:6543
所以我添加了一个Apache Virtual Host,这里是配置:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin admin@example.com
ServerName gitlab.example.com
ServerSignature Off
CustomLog /var/log/httpd/gitlab_access.log combined
ErrorLog /var/log/httpd/gitlab_error.log
ErrorLog syslog:local2
<IfModule mod_proxy.c>
ProxyVia On
ProxyRequests Off
ProxyPass / https://example.com:6543/
ProxyPassReverse / https://example.com:6543/
ProxyPreserveHost Off
<Proxy *>
Options FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Proxy>
</IfModule>
# SSL Config
SSLCertificateFile /etc/ssl/example.com/default.crt
SSLCertificateKeyFile /etc/ssl/example.com/default.key
SSLEngine on
SSLProtocol all …Run Code Online (Sandbox Code Playgroud) 对于站点可用.conf文件之一,我有以下配置。如果您点击 ,
它会配置为加载ghost博客blog.example.com。
不知何故,它也导致example.com提供博客。但这也很好。
<Virtualhost *:80>
ServerName blog.example.com
ServerAdmin admin80@example.com
ProxyPass / http://localhost:2368/
ProxyPassReverse / http://localhost:2368/
</Virtualhost>
Run Code Online (Sandbox Code Playgroud)
所以我刚刚安装phpmyadmin,我意识到我无法使用http://example.com/phpmyadmin. 访问该页面将显示未找到 ghost 的 404 页面。
所以我想我需要一些条件ProxyPass来忽略/phpmyadmin?
我尝试了以下方法也不起作用。
<Virtualhost *:80>
ServerName blog.example.com
ServerAdmin admin80@example.com
ProxyPass /phpmyadmin http://localhost/phpmyadmin
ProxyPassReverse /phpmyadmin http://localhost/phpmyadmin
ProxyPass / http://localhost:2368/
ProxyPassReverse / http://localhost:2368/
</Virtualhost>
Run Code Online (Sandbox Code Playgroud)
Apache 只是挂起,当我点击 时我必须重新启动它http://example.com/phpmyadmin。
更新:
我尝试了以下操作,它加载了phpmyadmin登录页面。只是:80在 localhost 之后添加的。并为虚拟主机指定一个特定的域名而不是*.
<Virtualhost blog.example.com:80>
ServerName blog.example.com …Run Code Online (Sandbox Code Playgroud) 我有一个域 (example.com) 和一个子域 (sub.example.com),它们都托管在同一台服务器上。我想代理一个请求,所以在http://sub.example.com/api/上请求的任何文件都将在http://example.com/api/上请求(连同参数) 这是我的 nginx 代码sub.example.com:
location /api {
rewrite /api/(.*) /api/$1 break;
proxy_pass http://example.com/api;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_buffering off;
}
Run Code Online (Sandbox Code Playgroud)
这对我不起作用。有效的是:
location ~* ^/api/(.*)$ {
rewrite ^/api/(.*)$ http://example.com/api/$1 last;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我忘了说我的服务器定义包含更多关于 Yii 框架和 php 文件解析的规则。这是完整的服务器语句:
server {
listen 80;
server_name sub.example.com;
access_log /var/log/nginx/sub.example.com.access_log main;
error_log /var/log/nginx/sub.example.com.error_log info;
root /var/www/localhost/htdocs/sub.example.com;
index index.php index.html index.htm default.html default.htm;
# location ~* ^/api/(.*)$ {
# rewrite ^/api/(.*)$ http://example.com/api/$1 last;
# …Run Code Online (Sandbox Code Playgroud) 假设我有项目 A、B 和 C。我有两个后端服务器:server01 和 server02。
项目 A 可以由 server01 处理,项目 B 和 C 可以由 server02 处理。添加和删除新项目和服务器,我们以编程方式更新文件、Redis、Memcache 或类似文件(无论代理支持什么)中项目 ID 和后端服务器之间的哈希表。
我可以制作一个前端,例如/items/${id}基于 HAProxy 路由到正确的后端服务器${id}吗?那么通过查找什么 id 与什么服务器相关联?
如果没有,Nginx 能做到这一点吗?
我想使用 Lighttp 在端口 8443 上将(反向代理)请求转发到https://secure.mydomain.com(:443)到我的内部 (HTTPS-)WebServer。
Environment-Infos:
我的 WebServer 是一个在端口 8080 (HTTP) 和端口 8443 (HTTPS) 上运行的 Tomcat。
HTTP 和 HTTPs 在本地访问时效果很好(http://127.0.0.1:8080和/或https://127.0.0.1:8443)
(端口 8080 + 端口 8443 不能通过 Internet 直接访问。)
对于HTTP,此配置有效:
$HTTP["host"] == "unsecure.mydomain.com" {
proxy.server = ( "" => ( (
"host" => "127.0.0.1",
"port" => 8080
) ) )
}
Run Code Online (Sandbox Code Playgroud)
问题:
反向代理HTTPS需要什么?
我正在 Nginx 上设置反向代理。我需要它来监听多个端口。然后我想在后端服务器上访问完全相同的端口。像这样:http://frontendserver:9000 -> http://backendserver:9000。
这是我认为会起作用的
## server configuration
server {
listen 9000 ;
listen 9001 ;
listen 9002 ;
listen 9003 ;
listen 9004 ;
listen 9005 ;
listen 9006 ;
listen 9007 ;
listen 9008 ;
listen 9009 ;
server_name frontendserver;
if ($http_x_forwarded_proto = '') {
set $http_x_forwarded_proto $scheme;
}
location / {
proxy_read_timeout 900;
proxy_pass_header Server;
proxy_cookie_path ~*^/.* /;
proxy_pass http://backendserver:$server_port/;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
} …Run Code Online (Sandbox Code Playgroud) reverse-proxy ×10
apache-2.2 ×4
nginx ×4
arr ×1
azure ×1
forwarding ×1
gitlab ×1
haproxy ×1
https ×1
ibm-domino ×1
iis ×1
lighttpd ×1
mod-rewrite ×1
mod-ssl ×1
proxy ×1
proxypass ×1
url-routing ×1