【问题标题】:Apache URL Rewriting with n arguments使用 n 个参数重写 Apache URL
【发布时间】:2010-02-12 21:44:13
【问题描述】:

我正在做一些 URL 重写,我可以通过以下方式完成我需要做的事情:

RewriteRule ^([^/]*)/([^/]*)$ index.php?arg1=$1&arg2=$2 [L,QSA]
RewriteRule ^([^/]*)$ index.php?arg1=$1 [L,QSA]

你得到了我在这里想要做的事情,我基本上想要获取完整的 url 并将其解析为单独的参数。所以 /blah/test/asdf/hi 会以 arg1=blah、arg2=test 等形式出现。

现在,如果我想将其扩展为 4 或 5 个参数,我想知道是否有一种更简洁的方式来呈现它,而不是使用 ?arg1=$1&arg2=$2&arg3=$3 等等等等。我已经看到人们以编程方式执行此操作(只需使用带有斜杠的整个字符串并在代码中解析它)但我很好奇是否有办法使用 apache 来做到这一点。

【问题讨论】:

    标签: apache mod-rewrite url-rewriting


    【解决方案1】:

    您可以使用 PHP 来做到这一点:

    $_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    
    $pathSegments = array_map('rawurldecode', explode('/', substr($_SERVER['REQUEST_URI_PATH'], 1)));
    

    第一行是从请求 URL 中获取 URL 路径。另一行将删除前导斜杠 (substr),分割成段 (explode) 并解码每个段(array_maprawrurldecode)。

    现在您只需将所有请求传递给您的 index.php

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule !^index\.php$ index.php [L]
    

    附加条件将排除可以映射到现有文件的请求。

    【讨论】:

    • 感谢您说明我提到的程序化方法。如果我想要这种灵活性,看起来就必须这样做。
    • @epalla:是的,当然。您的应用程序最了解如何解释 URL。所以它也应该做 URL 解释,而不是 mod_rewrite。
    猜你喜欢
    • 2012-11-22
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    相关资源
    最近更新 更多