使用mod_rewrite重写URL:多个规则出错

时间:2013-02-04 18:25:33

标签: .htaccess mod-rewrite url-rewriting rewrite

我在.htaccess中有以下代码

 Options +FollowSymLinks 
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(/([^/]+))?(/(edit)+)(/([^/]+))?/?$ edit.php?secret=Y7qD7&category=$1&slug=$3&edit=$5&part=$7 [L]
RewriteRule ^([^/]+)(/([^/]+))?/?$ content.php?category=$1&slug=$3 [L]
RewriteRule ^(/)?$ content.php [L]

我期望实现的是

http://example.com/test/test1/edit/part   to  edit.php?category=test&slug=test1&edit=edit&part=part
http://example.com/test/edit/part   to  edit.php?category=test&slug=&edit=edit&part=part

(以上重写按预期工作)

 `http://example.com/test/test/` to `content.php?category=test&slug=test` 
 `http://example.com/test/` to `content.php?category=test&slug=`

(请注意,以上2个网址中没有“/ edit /”&“/ part /”)

对于上述两次重写,第一次正常工作但第二次没有按预期工作。最后一个重写为content.php?category = content.php& slug =这是不正确的。

尾部斜线也不应该对重写产生影响。

有人可以告诉我这里我做错了吗?

1 个答案:

答案 0 :(得分:1)

我没有检查为什么问题中的规则无法正常工作,但您可以尝试这样做:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  ^/([^/]+)/?([^/]*)?/?([^/]*)?/?([^/]*)?/?
RewriteRule .*    edit.php?key1=%1&key2=%2&key3=%3&key4=%4     [L]

静默地映射:

http://example.com/val1/最多

带有或不带尾随斜杠的

http://example.com/val1/val2/val3/val4/

要:

http://example.com/edit.php?key1=val1&key2=val2&key3=val3&key4=val4

传入网址中传递的valN值的最大数量为4.最小值为1.但是,可以调整该范围来修改规则。

如果传入的网址中不存在任何valN,则添加到替换网址的查询中相应键值对中的值将为空。

但是,key将始终出现在查询中,因为所有keys都是未通过传入网址传递的固定字符串。

此规则集已经过测试和运行,应该在没有任何可能与之冲突的其他规则的情况下进行测试。我没有检查问题中的其他规则,也不能说它们是否有效或是否会影响这个规则。这不是问题的一部分。

更新

重定向到edit.php:

只有在URL路径中有3个或4个文件夹时才需要映射到edit.php。

修改后的规则集是:

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !edit\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/([^/]+)/([^/]+)/?([^/]*)?/?$  [NC]
RewriteRule .*    edit.php?key1=%1&key2=%2&key3=%3&key4=%4     [L,QSA]

静默地映射:

http://example.com/val1/val2/val3/最多

带有或不带尾随斜杠的

http://example.com/val1/val2/val3/val4/

要:

http://example.com/edit.php?key1=val1&key2=val2&key3=val3&key4=val4

传入网址中传递的最大valN值数量为4.最小值为3.


重定向到content.php:

映射到content.php与前一个非常相似,只有当文件夹数为1或2时才会这样做。

因此规则集与正则表达式组较少基本相同:

RewriteCond %{REQUEST_URI} !content\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/?([^/]*)?/?$  [NC]
RewriteRule .*    content.php?key1=%1&key2=%2   [L,QSA]

静默地映射:

http://example.com/val1/最多

带有或不带尾随斜杠的

http://example.com/val1/val2/

要:

http://example.com/content.php?key1=val1&key2=val2

传入网址中传递的最大valN值数量为2.最小值为1.

完整规则集是这样的:

Options +FollowSymLinks 
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !edit\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/([^/]+)/([^/]+)/?([^/]*)?/?$ [NC]
RewriteRule .*    edit.php?key1=%1&key2=%2&key3=%3&key4=%4  [L,QSA]

RewriteCond %{REQUEST_URI} !content\.php  [NC]
RewriteCond %{REQUEST_URI}  ^/([^/]+)/?([^/]*)?/?$  [NC]
RewriteRule .*    content.php?key1=%1&key2=%2   [L,QSA]

希望我理解你想要的东西。