【问题标题】:mod_rewrite - convert paths to querystringmod_rewrite - 将路径转换为查询字符串
【发布时间】:2010-08-20 18:25:03
【问题描述】:

考虑这条规则

RewriteRule ^/models/(.*)/(.*)$ /models?$1=$2 [NC,L]

这会将/models/application/lawnmower 重写为/models?appliction=lawnmower

很好,正是我想要的

现在考虑这条规则(最多有 6 个名称/值对)

RewriteRule ^/models/(.*)/(.*)/(.*)/(.*)$ /models?$1=$2&$3=$4 [NC,L]  

这应该重写

/models/application/lawnmower/series/xp

到

/models?application=lawnmower&series=xp  

但它实际上创造了

/models?application/lawnmower=series&GX=  

最后,我需要做的是获取 /models 之后的每个值,并将其解析为 qs 形式的名称/值对

任何想法

【问题讨论】:

    标签: url mod-rewrite


    【解决方案1】:

    有了更多信息,您可能会使用任意数量的键值对获取您的 URL,并将它们转换为查询字符串以传递给您的脚本。如果我没记错的话,Gumbo 用一种“循环”回答了一个类似的问题,这种“循环”允许类似的事情发生。

    但是,正如我相信他当时指出的那样,我现在将向您指出,使用mod_rewrite 这样做确实不是一个好主意。最好让mod_rewrite 将您的 URL 重写为您的脚本:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^/models/.*$ /models [NC,L]
    

    ...然后解析原始REQUEST_URI 值以提取您想要的信息。您选择的脚本语言比mod_rewrite 更适合此任务。

    就修改您当前的规则而言,我认为您对服务器的请求可能有一个斜杠?由于您的 (.*) 分组可以匹配任何内容(或不匹配任何内容),因此如果您后面有其他三个斜杠,它们会贪婪地使用第一个斜杠作为键名的一部分。简单的解决方案是不匹配捕获组中的斜杠:

    RewriteRule ^/models/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /models?$1=$2&$3=$4 [NC,L]  
    

    请注意,如果您尝试将这作为一系列六个独立的规则来执行,那么您将用完反向引用,因为您在这里可以获得(您定义的)最多是 9 个。

    【讨论】:

    • @jason - 我只是指出,如果您的 URL 变得过于复杂,那么在效率和简单性方面,让您的脚本完成从 URL 中解析数据的工作通常是一个更好的主意,而不是让mod_rewrite 去做。在这种情况下,您将使用 mod_rewrite 更改 URL 以指向您的脚本,然后使用您的脚本来确定键值对应该是什么。
    • @jason - 啊哈,很好地抓住了 JavaScript 文件。
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    相关资源
    最近更新 更多