Рейтинг:2

Create "shortcut" for GET parameters redirection in Apache2

флаг cn

I try to create a config in apache server that will transfer the url

foo.bar/baz/hq

to

foo.bar/baz#a=1;b=2;c=3

where baz can be anything. I tried this (see https://stackoverflow.com/a/8606198/3475778)

RewriteRule ^([A-Za-z0-9-]+)/hq$ $1#foo=bar [NC,NE,R=302]

but somehow the redirect doesnt seem to work and I do not know why.

My conf file looks like this - sorry it is a bit messy, I am not a sysadmin.

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName xxx
    Redirect    302 /   http://xxx/


SSLCertificateFile /etc/letsencrypt/live/xxx/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/xxx/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName xxx
    ErrorLog /var/log/apache2/xxx.net-error.log

    RewriteEngine on
    RewriteRule ^([A-Za-z0-9-]+)/hq$ $1#foo=bar [NC,NE,R=302]

    ProxyPass "/" "http://localhost:8000/"
    ProxyPassReverse "/" "http://localhost:8000/"
    ProxyPass "/http-bind" "http://localhost:8000/http-bind/"
    ProxyPassReverse "/http-bind" "http://localhost:8000/http-bind"
    RewriteEngine on
# Some rewrite rules in this file were disabled on your HTTPS site,
# because they have the potential to create redirection loops.

        RewriteCond %{HTTP:Upgrade} websocket [NC]
        RewriteCond %{HTTP:Connection} upgrade [NC]
        RewriteRule ^/?(.*) "ws://localhost:8000/$1" [P,L]


SSLCertificateFile /etc/letsencrypt/live/xxx/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/xxx/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
user10489 avatar
флаг nc
Почему там есть комментарий об отключении правил перезаписи из-за цикла перенаправления?
capitalg avatar
флаг cn
@user10489 user10489 этот файл/раздел был автоматически сгенерирован из certbot
Рейтинг:0
флаг nc

Часть URL после # не передается на веб-сервер в GET, поэтому он не может узнать, было ли перенаправление уже выполнено или нет. Это превратилось бы в рекурсивное перенаправление без возможности разорвать цикл.

Если вы хотите сделать что-то подобное, это нужно сделать на стороне клиента, возможно, в javascript, где можно получить доступ к якорной части URL-адреса.

Вы можете отправить кого-нибудь по ссылке с символом # из приложения на стороне сервера, но это будет полезно только для ссылок, ведущих на эту страницу (включая ссылки на той же странице). Если вы хотите сделать это с той же страницы, вам все равно понадобится что-то на стороне клиента, чтобы это произошло.

capitalg avatar
флаг cn
Спасибо за ваш ответ, но в связанном ответе SE (https://stackoverflow.com/a/8606198/3475778) упоминается, что перенаправление на `#` возможно через перенаправление, что я и хочу здесь сделать. Перенаправление сверху не должно быть рекурсивным, так как только с приложением `*/hq` вы получите перенаправление - доступ к этому URL-адресу осуществляется только путем ручного добавления к существующему URL-адресу. Но каким-то образом, даже если я изменю его на что-то без `#`, я все равно не смогу заставить перенаправление работать, и я не могу понять, почему оно не работает.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.