Спасибо за все ответы. Хочу пояснить, что число после 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>
Попробуй это
<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 и моды перезаписи.
Я предполагаю, что вы хотите проксировать все запросы на другой хост, который вы используете в конфигурации прокси. Поэтому вам следует объединить обе задачи в один набор директив, например:
<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», вы можете легко адаптировать указанное выше регулярное выражение.
Это должно работать для каталога первого уровня с буквенно-цифровыми символами.
<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>
Вы спросили, что не так с вашими правилами перезаписи. Посмотрите на эти две строки в своей конфигурации:
RewriteCond %{REQUEST_URI} !^/(.+/)faces/main.jsf.*
RewriteRule !^(.+)/faces/main.jsf.*$ $1/faces/main.jsf [L,R]
Ваше правило RewriteCond будет соответствовать, если в URL-адресе еще нет бита faces / main.jsf. Выглядит нормально. Тогда ваше RewriteRule не должно пытаться сопоставить /faces/main.jsf. Я действительно не уверен, что вы ожидаете от ведущего '!' по этому шаблону.
Может, вам нужно что-то вроде этого:
RewriteCond %{REQUEST_URI} !^/(.+/)faces/main.jsf.*
RewriteRule ([^;]*)(;.*)? $1/faces/main.jsf$2 [L,R]]
Ваша конструкция с символом ';' довольно необычно, и если бы я увидел это в системе, я бы дважды проверил, действительно ли это то, что нужно (хотя это был не ваш вопрос). A ';' после '?' может использоваться так же, как '&', что снижает необходимость в экранировании в html. Вы это имели в виду? Если да, то вы должны знать, что часть URL-адреса после символа "?" не является частью того, что передается в RewriteRule.