为什么这个htaccess重写不起作用?

时间:2014-08-31 16:43:21

标签: .htaccess flash

好的,所以我试图让它如果人们去/?char=USERNAME它会显示/game/CharWidget.swf?login=USERNAME的内容。到目前为止,这是我的代码:

RewriteEngine on
RewriteCond %{QUERY_STRING} char=(.*)
RewriteRule ^index.php?char=(.*) /game/CharWidget.swf?login=%1

这会使网址服务器端为/game/CharWidget.swf但不携带?char =用户名并使其成为?login = username因此它不会显示我想要显示的内容。

编辑;如果/char/USERNAME/game/CharWidget.swf?login=USERNAME更容易,如果有人可以给我代码,我就不介意这样做。

1 个答案:

答案 0 :(得分:0)

查询字符串对RewriteRule不可见,因此^index.php?char=(.*)永远不会匹配。 (除此之外,由于您尚未转义.?,因此 将匹配indexZphchar=foo,这可能不是您想要的。)

此外,如果用户访问/?char=USERNAMERewriteRule通常会看到/;没有index.php。最后,如果这是在.htaccess文件中,您通常也需要RewriteBase指令。

将所有这些修复放在一起,这样的事情应该有效:

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING} ^char=(.*)$
RewriteRule ^/?(index\.php)?$ /game/CharWidget.swf?login=%1 [NS]

(正则表达式^/?(index\.php)?$将匹配空路径或index.php,带或不带前导斜杠。这使得它比绝对必要的更复杂,但也更强大。特别是/?允许它在.htaccess文件之外工作,其中会出现前导斜杠。)

聚苯乙烯。正则表达式^char=(.*)$还允许将/?char=foo&bar=baz等网址重写为/game/CharWidget.swf?login=foo&bar=baz。如果您不想允许此类重写,请将其替换为例如^char=([^&;]*)$


编辑:不幸的是,this isn't going to work for .swf files,因为那些在客户端上执行,因此无法看到服务器端重写对查询字符串所做的任何更改。

所能做的是通过将[NS]标记替换为[NS,L,R=302]来重写外部。但是,这也会更改浏览器地址栏中显示的URL,这可能不是您想要的。如果是这样,另一个选项是使原始请求提供给您嵌入 .swf文件的HTML页面。