更新
感谢到目前为止的所有回复。我想澄清的是,user
我示例中后面的数字(例如 user1)并不重要。用户可以是任何字母数字名称。
我想确保如果指定了目录,我们会将“/faces/main.jsf”附加到其末尾。
例如
我们希望 URL 看起来像这样:
example.com/user1/faces/main.jsf
系统可以附加类似内容(我们必须允许)
http://example.com/user1/faces/main.jsf;jsessionid=Z_DV-bY6MuQGlIvflPwgdKDk60cNzOkWXbC5G18ILrjR0jKoGWnd!-617980607
如果请求类似于以下任一情况:
example.com/user1
example.com/user1/
我想将“/faces/main.jsf”附加到其中。我的重写规则有什么问题?
<VirtualHost *:80>
ServerName example.com
ProxyPass / http://1.example.com:8888/
ProxyPassReverse / http://1.example.com:8888/
RewriteEngine On
# RewriteLog /tmp/rewrite.log
RewriteCond %{HTTP_HOST} !^example.com$
RewriteRule !^/(.) http://example.com/$1 [L,R]
RewriteCond %{REQUEST_URI} !^/(.+/)faces/main.jsf.*
RewriteRule !^(.+)/faces/main.jsf.*$ $1/faces/main.jsf [L,R]
</VirtualHost>
答案1
我假设您希望将所有请求代理到代理配置中使用的其他主机。因此,您应该将两个任务合并为一组指令,如下所示:
<VirtualHost *:80>
ServerName example.com
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/(.+/)faces/main.jsf
RewriteRule ^(.+?)(;.*) http://1.example.com:8888/$1/faces/main.jsf$2 [P]
ProxyPassReverse / http://1.example.com:8888/
</VirtualHost>
如果您只想重写特定的 URL(例如“/userX”),则可以轻松地调整上述正则表达式。
答案2
尝试这个
<VirtualHost *:80>
ServerName example.com
ProxyPass / http://1.example.com:8888/
ProxyPassReverse / http://1.example.com:8888/
RewriteEngine On
# RewriteLog /tmp/rewrite.log
RewriteBase /
RewriteCond %{HTTP_HOST} !^example.com$
RewriteRule !^/(.) http://example.com/$1 [L,R]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(user\d/)$ $1faces/main.jsf [L,R]
</VirtualHost>
这对 user0..user9 有效,但对 user10 无效。如果这是个问题,请将最后一条重写规则更改为使用 ^(user\d+/)$
答案3
<VirtualHost *:80>
ServerName example.com
RewriteEngine On
RewriteRule ^/user1/(.*) http://1.example.com:8888/user1/faces/main.jsf$1 [L,P]
RewriteRule ^/user1(.*) http://1.example.com:8888/user1/faces/main.jsf$1 [L,P]
RewriteRule ^/(.*) http://1.example.com:8888/$1 [L,P]
</VirtualHost>
例如:
http://example.com/user2-->http://1.example.com:8888/user2
http://example.com/user1-->http://1.example.com:8888/user1/faces/main.jsf
http://example.com/user1/-->http://1.example.com:8888/user1/faces/main.jsf
http://example.com/user1;jsessionid=Z_DV-bY6MuQGlIvflPwgdKDk60cNzOkWXbC5G18ILrjR0jKoGWnd!-617980607
-->
[P] 将代理往返于后端的请求。
除非你真的想让 /user2 --> /user9 也起作用,否则就应该这样,如果是这样的话,就说确切地你正在寻找什么,以便我可以为你提供正确的规则:-)
为了使上述功能正常工作,您当然需要启用代理、proxy_http 和重写模式。
答案4
您问重写规则出了什么问题。请查看配置中的这两行:
RewriteCond %{REQUEST_URI} !^/(.+/)faces/main.jsf.*
RewriteRule !^(.+)/faces/main.jsf.*$ $1/faces/main.jsf [L,R]
如果 URL 中还没有 faces/main.jsf 位,则 RewriteCond 规则将匹配。这看起来不错。然后,RewriteRule 不应尝试匹配 /faces/main.jsf。我真的不确定您希望在该模式中使用前导 '!' 会发生什么。
也许你想要这样的东西:
RewriteCond %{REQUEST_URI} !^/(.+/)faces/main.jsf.*
RewriteRule ([^;]*)(;.*)? $1/faces/main.jsf$2 [L,R]]
您使用“;”的构造非常不寻常,如果我在系统中看到它,我会仔细检查这是否确实是想要的(尽管这不是您的问题)。“?”后面的“;”可以像“&”一样使用,从而减少了在 html 中转义的需要。这是您的意思吗?如果是这样,那么您应该知道“?”后面的 URL 部分不是提供给 RewriteRule 的内容的一部分。