Назад | Перейти на главную страницу

Правило перезаписи: добавление пути к 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>

Попробуй это

<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

->

http://1.example.com:8888/user1/faces/main.jsf;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.