これまでのすべての返信に感謝します。私の例では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>
「/ userX」などの特定のURLのみを書き換えたい場合は、上記の正規表現を簡単に適合させることができます。
これを試して
<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 + /)$を使用します
<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、および書き換えmodを有効にする必要があります。
これは、英数字を含む第1レベルのディレクトリで機能するはずです。
<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]
RewriteRule ^/([a-z0-9]+)/?$ /$1/faces/main.jsf [L,R,NC]
</VirtualHost>
書き換えルールの何が問題になっているのか尋ねました。構成内の次の2行を見てください。
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]]
';'を使用した構築これは非常に珍しいことであり、システムでそれを見た場合、それが実際に必要なものであることを再確認します(それはあなたの質問ではありませんでしたが)。 A ';' '?'の後'&'と同じ方法で使用できるため、htmlでエスケープする必要が少なくなります。それはあなたが意味したことでしたか?もしそうなら、あなたは「?」の後のURLの部分を知っているべきですRewriteRuleに供給されるものの一部ではありません。