【发布时间】:2014-08-27 12:36:50
【问题描述】:
这是我有效的 .htaccess 规则:
RewriteCond %{REQUEST_URI} ^/work
RewriteCond %{QUERY_STRING} ^foo=bar$
RewriteRule ^(.*)$ /test.php
不幸的是,如果我想将一些参数附加到重写的路径中,它不起作用:
RewriteCond %{REQUEST_URI} ^/work
RewriteCond %{QUERY_STRING} ^foo=bar$
RewriteRule ^(.*)$ /test.php?par=new
如果我添加[R=301],那么它也可以,但我不想添加它,因为我不希望用户看到地址已更改:
RewriteCond %{REQUEST_URI} ^/work
RewriteCond %{QUERY_STRING} ^foo=bar$
RewriteRule ^(.*)$ /test.php?par=new [R=301]
为什么第二个不起作用?我错过了什么? 环境: Ubuntu 12.04,XAMPP(Apache/2.4.4)
谢谢。
编辑 1
根据Internal URL rewrite no longer working after upgrading Apache to 2.4,这似乎是与 Apache 2.4 相关的错误。
.htaccess:
RewriteCond %{QUERY_STRING} ^foo=bar$
RewriteRule ^work/(.*)$ /test.php?par=new [L]
执行curl http://alison/work/?foo=bar -v时记录
[Thu Aug 28 15:36:39.728123 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1e05820/initial] [perdir /home/amareknight/Projects/firstmg/root/alison/] strip per-dir prefix: /home/amareknight/Projects/firstmg/root/alison/work/ -> work/
[Thu Aug 28 15:36:39.728141 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1e05820/initial] [perdir /home/amareknight/Projects/firstmg/root/alison/] applying pattern '^work(.*)$' to uri 'work/'
[Thu Aug 28 15:36:39.728170 2014] [rewrite:trace4] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1e05820/initial] [perdir /home/amareknight/Projects/firstmg/root/alison/] RewriteCond: input='foo=bar' pattern='^foo=bar$' => matched
[Thu Aug 28 15:36:39.728186 2014] [rewrite:trace2] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1e05820/initial] [perdir /home/amareknight/Projects/firstmg/root/alison/] rewrite 'work/' -> '/test.php?par=new'
[Thu Aug 28 15:36:39.728201 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1e05820/initial] split uri=/test.php?par=new -> uri=/test.php, args=par=new
[Thu Aug 28 15:36:39.728218 2014] [rewrite:trace1] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1e05820/initial] [perdir /home/amareknight/Projects/firstmg/root/alison/] internal redirect with /test.php [INTERNAL REDIRECT]
[Thu Aug 28 15:36:39.728420 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] strip per-dir prefix: /home/amareknight/Projects/firstmg/root/alison/work/index.html -> work/index.html
[Thu Aug 28 15:36:39.728436 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] applying pattern '^work(.*)$' to uri 'work/index.html'
[Thu Aug 28 15:36:39.728457 2014] [rewrite:trace4] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] RewriteCond: input='par=new' pattern='^foo=bar$' => not-matched
[Thu Aug 28 15:36:39.728473 2014] [rewrite:trace1] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] pass through /home/amareknight/Projects/firstmg/root/alison/work/index.html
[Thu Aug 28 15:36:39.728624 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1f9a360/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] strip per-dir prefix: /home/amareknight/Projects/firstmg/root/alison/work/index.html.var -> work/index.html.var
[Thu Aug 28 15:36:39.728640 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1f9a360/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] applying pattern '^work(.*)$' to uri 'work/index.html.var'
[Thu Aug 28 15:36:39.728660 2014] [rewrite:trace4] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1f9a360/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] RewriteCond: input='par=new' pattern='^foo=bar$' => not-matched
[Thu Aug 28 15:36:39.728675 2014] [rewrite:trace1] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1f9a360/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] pass through /home/amareknight/Projects/firstmg/root/alison/work/index.html.var
[Thu Aug 28 15:36:39.728741 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] strip per-dir prefix: /home/amareknight/Projects/firstmg/root/alison/work/index.php -> work/index.php
[Thu Aug 28 15:36:39.728760 2014] [rewrite:trace3] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] applying pattern '^work(.*)$' to uri 'work/index.php'
[Thu Aug 28 15:36:39.728779 2014] [rewrite:trace4] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] RewriteCond: input='par=new' pattern='^foo=bar$' => not-matched
[Thu Aug 28 15:36:39.728794 2014] [rewrite:trace1] [pid 14865] mod_rewrite.c(468): [client 127.0.0.1:33092] 127.0.0.1 - - [alison/sid#1b438a0][rid#1fa24a0/subreq] [perdir /home/amareknight/Projects/firstmg/root/alison/] pass through /home/amareknight/Projects/firstmg/root/alison/work/index.php
我的 index.php 位于 /work 目录中,似乎 Apache 只是忽略了 INTERNEL_REDIRECT 并加载了 index.php。
【问题讨论】:
-
你试过使用
[QSA,L]吗?此外,如果您使用QSA并且 URL 之前包含?par=new,您甚至不需要再次附加它,因为它会自动完成。 -
您的 .htaccess 中是否还有更多规则?
-
@Prix 原网址没有
?par=new,我只是想追加。
标签: apache .htaccess mod-rewrite