重写规则:将路径附加到 URL

重写规则:将路径附加到 URL

更新

感谢到目前为止的所有回复。我想澄清的是,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

-->

http://1.example.com:8888/user1/faces/main.jsf;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 的内容的一部分。

相关内容