【问题标题】:Fail to rewrite url and append parameters in .htaccess无法在 .htaccess 中重写 url 和附加参数
【发布时间】: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


【解决方案1】:

您可以在根 .htaccess 中使用这样的规则:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^foo=bar$ [NC]
RewriteRule ^work /test.php?par=new [L,QSA,NC]

这将在内部将 /work/abc?foo=bar 之类的 URL 重写为 /test.php?foo=bar&par=new

【讨论】:

  • 对我不起作用。实际上我认为这是一个与 Apache 2.4 相关的错误,因为相同的 .htaccess 在 Apache 2.2 上工作。
  • 您在浏览器中看到的 URL 是什么?这个 .htaccess 位于何处?
  • 我不使用浏览器测试,我只是使用curl:curl "http://alison/work/?foo=bar" -v
  • @AmareKnight 你能用你的.htaccess 文件的精确副本更新你的问题吗?
  • @AmareKnight 我们确实会在称其为错误之前尝试用尽可能性;)但很高兴您解决了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多