我写了这个问题,并意识到大多数人都不想读那么多文字。考虑以下参考,这里是TL; DR:
我需要301重定向此网址http://app.com/search/foo-bar/
到此网址http://app.com/#!/search/foo-bar/
并将此/foo-bar/
或其他任何超过/search/
的内容发送到服务器端脚本。在这种情况下,它是用PHP编写的。
为了清晰起见进行编辑:
目前的答案似乎集中在改写为hashbang。那部分不是问题。问题是我在重写到hashbang url时丢失了任何相关数据,因为服务器端会将app.php视为位置,而不是app.php /#!/ foo-bar / - 所以我需要捕获foo-bar ,并将其发送到除URL之外的其他地方的服务器。重写有效,而不是问题。谢谢你的答案!
好的,所以我有一个很难找到的有趣问题。
情景:
我有一个使用hashbang进行状态的backbone.js应用程序:
app.com/#!/search/search-term/key-value/foo-bar/
此外,我从之前的版本进入网站的谷歌流量将会点击“漂亮的网址”风格网址:
app.com/search/search-term/key-value/foo-bar/
如果用户点击旧网址,我会使用.htaccess mod_rewrite将旧网址交换为hashbanged网址。
我最近推出了一个无javascript的自举网站版本,该网站将建立在优雅降级和支持抓取工具之上。这是用php编写的。
要使php网站正常工作,我需要将经过hashbang的值传递到服务器端脚本,这样我就可以找出要显示的内容。
问题:
当我转换网址并添加锚点时,通过锚点(hashbang)的所有内容都不再发送到请求,因此我无法在php中访问它。
RewriteRule search/?(.*) #!/search/$1 [R=301,NC,L]
我将服务器端发送到服务器端的选项减少为: 1.查询字符串 2.环境变量 3.标题
所以,我尝试通过查询字符串发送内容
RewriteRule search/?(.*) #!/search/$1?filter=$1 [R=301,NC,L]
显然这不起作用(查询在锚点后面),所以我在hashbang面前试了一下
RewriteRule search/?(.*) ?filter=$1/#!/search/$1 [R=301,NC,L]
这是有效的,但对最终用户来说是可怕的和多余的。所以,我想我可能会尝试使用环境变量。
RewriteRule search/?(.*) /!#/search/$1 [R=301,NC,L,E=FILTER:$1]
失败了,因为环境变量不是通过重定向(duh)保留的。我转向使用标题:
RewriteRule search/?(.*) /#!/search/$1 [R=301,NC,L,E=FILTER:$1]
Header set filterParams "%{FILTER}e"
但由于某种原因,页面不会通过重定向接收标头。这似乎是有道理的(虽然我现在已经超出了我对apache指令的舒适程度),所以我尝试回应标题,希望它会被传递,被第二次重写(没有找到搜索) ),并呼应。
RewriteRule search/?(.*) /#!/search/$1 [R=301,NC,L,E=FILTER:$1]
Header set filterParams "%{FILTER}e"
Header echo filterParams
Nada - 过滤器不存在,所以虽然它是服务器,但它是null。我的下一个想法是试图采用某种条件。这是我的尝试:
RewriteRule search/?(.*) legacy.php/#!/search/$1 [R=301,NC,L,E=FILTER$1]`
<FilesMatch "legacy.php">
Header set filterParams "%{FILTER}e"
</FilesMatch>
Header echo filterParams
这似乎也没有用,所以我很难过。我意识到我已经花了很长时间在这上面,我可能已经掌握了解决方案,我只是厌倦了看它,或者它甚至都不可能,即使是粗略的黑客攻击。
任何人都知道如何做到这一点?
答案 0 :(得分:0)
答案 1 :(得分:0)
AFAIK,没有好办法通过重定向保留变量而不将它们粘在查询字符串中......