我尝试在 apache 服务器中创建一个配置来传输 url
foo.bar/baz/hq
到
foo.bar/baz#a=1;b=2;c=3
其中 baz 可以是任意值。我尝试过这个(参见https://stackoverflow.com/a/8606198/3475778)
RewriteRule ^([A-Za-z0-9-]+)/hq$ $1#foo=bar [NC,NE,R=302]
但不知何故,重定向似乎不起作用,我不知道为什么。
我的配置文件看起来像这样 - 抱歉,有点混乱,我不是系统管理员。
<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>
答案1
url 后面的部分#
不会通过 GET 传输到 Web 服务器,因此无法知道重定向是否已完成。这将变成递归重定向,无法中断循环。
如果您想做这样的事情,则需要在客户端完成,可能使用 javascript,其中可以访问 URL 的锚点部分。
您可以从服务器端应用程序向某人发送带有 # 的链接,但这只对指向此页面的链接有用(包括同一页面上的链接)。如果您想从同一页面执行此操作,您仍然需要客户端来实现它。