更新
感谢到目前为止的所有回复。我想明确一点,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>
尝试这个
这将适用于 user0..user9 但不适用于 user10。如果这是一个问题,请将最后一个重写规则更改为使用 ^(user\d+/)$
我假设您要将所有请求代理到您在代理配置中使用的其他主机。因此,您应该将这两个任务组合成一组指令,如下所示:
如果你只想重写特定的 URL,例如“/userX”,你可以很容易地适应上面的正则表达式。
例如:
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
-->
http://1.example.com:8888/user1/faces/main.jsf;jsessionid=Z_DV-bY6MuQGlIvflPwgdKDk60cNzOkWXbC5G18ILrjR0jKoGWnd!-617980607
[P] 将代理进出您的后端的请求。
应该是这样,除非您实际上打算 /user2 --> /user9 也可以工作,如果是这样,请准确说出您要查找的内容,以便我可以给您正确的规则:-)
要使上述工作正常,您当然需要启用代理、proxy_http 和重写模块。
这应该适用于具有字母数字字符的第一级目录。
你问你的重写规则有什么问题。查看配置中的这两行:
如果 url 还没有 faces/main.jsf 位,您的 RewriteCond 规则将匹配。看起来不错。你的 RewriteRule 不应该尝试匹配 /faces/main.jsf。我真的不确定你对领先的 '!' 期望发生什么。在那个图案上。
也许你想要这样的东西:
你的建设与';' 是很不寻常的,如果我在系统中看到它,我会仔细检查这实际上是想要的,(尽管这不是你的问题)。一个 ';' 之后 '?' 可以以与“&”相同的方式使用,这减少了在 html 中转义的需要。那是你的意思吗?如果是这样,那么您应该知道“?”之后的 URL 部分。不是提供给 RewriteRule 的内容的一部分。