.htaccess mod_rewrite变量通过重定向

时间:2011-05-28 18:07:29

标签: .htaccess mod-rewrite redirect server-side hashbang

简短版本:

我写了这个问题,并意识到大多数人都不想读那么多文字。考虑以下参考,这里是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

这似乎也没有用,所以我很难过。我意识到我已经花了很长时间在这上面,我可能已经掌握了解决方案,我只是厌倦了看它,或者它甚至都不可能,即使是粗略的黑客攻击。

任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:0)

rfc1738.txt表示#不是有效的网址字符

另外,apache docs表示#表示apache配置文件中的注释。

简短回答是您的解决方案被破坏而不是您的实施

答案 1 :(得分:0)

AFAIK,没有好办法通过重定向保留变量而不将它们粘在查询字符串中......