0

我在 .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= 这是不正确的。

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

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

4

1 回答 1

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传入 URL 中传递的值的最大数量为 4。最小值为 1。不过,可以通过修改规则来调整该范围。

valN传入 URL 中不存在任何内容时,添加到替换 URL 的查询中相应键值对中的值将为空。

但是,key将始终出现在查询中,因为所有keys都是固定字符串,而不是传入 URL 传递的。

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

更新

重定向到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

传入 URL 中传递的 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

传入 URL 中传递的 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]

希望我明白你想要什么。

于 2013-02-04T19:57:43.003 回答