在htaccess中重写的奇怪行为

时间:2014-07-13 07:39:56

标签: apache .htaccess mod-rewrite

以下是规则:

RewriteCond %{REQUEST_URI} ^/index.php$
RewriteCond %{QUERY_STRING} one_art=29$
RewriteRule (.*) http://www.pests.co.il/%ee%e0%ee%f8%e9%ed/%e4%e3%e1%f8%fa_%fa%e9%f7%f0%e9%ed_/29$1 [R=301,L]

如果我输入以下网址,一切正常,重定向有效:

http://www.pests.co.il/?one_art=29

如果我输入以下网址,则会重定向到错误的不存在的网址:

http://www.pests.co.il/index.php?one_art=29

重定向到:

    http://www.pests.co.il/%25ee%25e0%25ee%25f8%25e9%25ed/%25e4%25e3%25e1%25f8%25fa_%25fa%25e9%25f7%25f0%25e9%25ed_/29index.php?one_art=29

为什么会发生这种情况?我删除了所有其他重写,以确保它没有其他干扰,但这仍然发生。

***** 编辑 ********

现在好多了。但是如果只是没有index.php的查询字符串,仍然无法重写:如果我这样做:

RewriteCond %{REQUEST_URI} ^/index.php$ 
RewriteCond %{QUERY_STRING} one_art=29$ 
RewriteRule (.*) pests.co.ilמאמרים/הדברת_תיקנים_/29? [R=301,NE,L] 

然后带有index.php的url正确重写,但没有index.php的url不会改变。

如果我这样做,那么一切都行不通。请注意前三行与上面相同我只是添加了另外两行来处理没有index.php的url:

RewriteCond %{REQUEST_URI} ^/index.php$ 
RewriteCond %{QUERY_STRING} one_art=29$ 
RewriteRule (.*) pests.co.ilמאמרים/הדברת_תיקנים_/29? [R=301,NE,L]  

RewriteCond %{QUERY_STRING} one_art=29$ 
RewriteRule (.*) pests.co.ilמאמרים/הדברת_תיקנים_/29? [R=301,NE,L] 

2 个答案:

答案 0 :(得分:2)

  

为什么会发生这种情况?

  • (.*)在域和可选斜杠之后以及查询字符串之前捕获URL的一部分到组1。
  • ...ed_/29$1在重写的网址
  • 末尾添加了第1组的内容
  • 如果是http://www.pests.co.il/?one_art=29,则第1组为空,因此不会添加任何内容
  • 如果是http://www.pests.co.il/index.php?one_art=29,则第1组为index.php,并在“... ed_ / 29`
  • 之后添加

答案 1 :(得分:1)

默认情况下,mod_rewrite将转义特殊字符,例如% - 变为%25,因此%ee变为%25ee等。阅读noescape flag。您的规则应该包含标记[R=301,NE,L]