【问题标题】:Rewriting urls using mod_rewrite : Error with multiple rules使用 mod_rewrite 重写 url:多条规则出错
【发布时间】:2013-01-19 12:35:02
【问题描述】:

我在 .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个url中没有“/edit/”和“/part/”)

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

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

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

【问题讨论】:

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


    【解决方案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

    传入 URL 中传递的 valN 值的最大数量为 4。最小值为 1。不过,可以通过修改规则来调整该范围。

    当传入 URL 中不存在任何 valN 时,添加到替换 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]
    

    希望我明白你想要什么。

    【讨论】:

    • 谢谢!这很棒。但我想重定向到两个不同的文件。我使用第一个规则重定向到 edit.php,我还尝试使用另一个规则重定向到 content.php
    • 请用示例更新您的所有问题。不可能从规则中猜出您需要什么,特别是如果它们不起作用并且是问题的原因。
    • 我已经编辑了这个问题。有时间请看一下。
    • @Ninearts 更新了我的答案。希望这是你需要的。
    • 你是我的英雄! :) 非常感谢您的详细回答。正是我想要的。
    猜你喜欢
    • 2012-07-22
    • 2010-12-25
    • 2020-11-25
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2011-03-12
    相关资源
    最近更新 更多