【问题标题】:URL Rewrite not working as expected with multiple parameters使用多个参数时,URL 重写无法按预期工作
【发布时间】:2015-10-12 20:30:04
【问题描述】:

我想按照这些思路创建一个干净的 url http://example.com/secretkey/username/apifunction/data_in/

并且使用以下 URL 重写规则,它似乎可以正常工作

RewriteRule ^/?([^-]+)/([^-]+)/([^-]+)/([^-]+)/?$ /api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA]

当我从 url 重写测试器获得以下输出确认时。

http://example.com/api.php?Key=secretkey&user=username&funct=apifunction&request=data_in

然而,它似乎在哪里倒塌,而我正在努力理解的部分是,如果我在 URL 的末尾添加一个额外的 /moredata/ ,它就会全部崩溃。并且 url 重写测试器显示我的 url 现在返回如下。

http://example.com/api.php?Key=secretkey/username&user=apifunction&funct=data_in&request=moredata/

我们将不胜感激任何关于我哪里出错的建议,以及我重写中的任何突出错误(这对我来说都是新的)。

【问题讨论】:

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


    【解决方案1】:

    [^-]+ 表示匹配直到找到下一个- 或行结束。但在您的情况下,您实际上匹配的是由 / 分隔的 URL 组件。

    试试这个代码:

    RewriteEngine On
    RewriteBase /apitest/
    
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA]
    

    【讨论】:

    • 我在发帖前尝试过这条规则,因为我想知道它是否与 [^-] 中的 - 有关,但是当我尝试这个规则时,这条规则不再匹配。
    • 不是真的,这是.htaccess文件<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^([^/]+)/([^/]+)/([^/]+)/([^/]+)/?$ /apitest/api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA] </IfModule>页面位于http://localhost/apitest/secretkey/username/apifunction/data_in/moredata/
    • 当我尝试调用页面The requested URL /apitest/secretkey/username/apifunction/data_in/moredata/ was not found on this server.时出现以下错误
    • 好的,所以如果我在 /apitest/.htaccess 中使用您的重写规则并调用以下 URL http://localhost/apitest/secretkey/username/apifunction/data_in/ 它确实会加载页面并返回正确的数据,如果我将其更改为 @ 987654330@ 然后我得到Not Found The requested URL /apitest/secretkey/username/apifunction/data_in/more/ was not found on this server.
    • 好的,所以在修改了更新的重写代码后,您几乎可以完成我想做的事情,我已经让它工作了。 RewriteRule ^([^/]+)/([^/]+)/([^/]+)/(.*)$ /api.php?apiKey=$1&user=$2&funct=$3&request=$4 [L,QSA] 感谢您为我指明正确的方向并提供帮助!
    【解决方案2】:

    造成这种行为的关键因素有 2 个:

    1. 您的正则表达式分组是 ([^-]+),这意味着:“匹配除 - 字符之外的任何内容”
    2. 默认情况下,正则表达式匹配是贪心的,这意味着它会尽可能匹配。

    这意味着您的第一个分组([^-]+) 匹配两个路径元素以及/。如果您真的想匹配除- 之外的所有字符,则在除结尾之外的所有字符中都包含/

    RewriteRule ^/?([^-/]+)/([^-/]+)/([^-/]+)/([^-]+)/?$ /api.php?Key=$1&user=$2&funct=$3&request=$4 [L,QSA]
    

    【讨论】:

    • 正则表达式来自我一直在阅读的关于 url 重写的教程(因为正则表达式是我正在阅读以使其正常工作的另一部分)。我不需要在我的 URL 中排除 - 字符,理想情况下我需要匹配每个 / 之间的所有内容,
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多