0

正如我之前的问题可能已经向您展示的那样,我对 modrewrite 不是很好。我试图搜索并为这个特定问题提出空缺。我希望有人可以帮助我解决这个问题;

我使用 modrewrite 作为短 URL 生成器的一部分,直接访问唯一 ID 会将它们转发到它们的目的地。在末尾添加 /v 将允许门户页面显示它们被转发到的 URL(如预览页面)

因为 /v 在 ID 之后,所以它工作得很好,但是我想允许通过$_GET添加新页面

这是提供给用户的快捷链接;

javascript:void(location.href='http://www.website.com/n/?url='+location.href)

这是 .htaccess 的内容

RewriteEngine On

RewriteRule ^n actions.php?do=new [NS,L,NC]
RewriteRule ^([a-zA-Z0-9]+)$ actions.php?id=$1 [NC]
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$  actions.php?id=$1&do=$2 [NC]

问题: 因为/n代替了 ID,它显然是冲突的。我尝试过 NS 和 L,因为它们能够在规则匹配后停止执行。经过进一步检查,它们当然不会像我想要的那样工作。

最后,这里有一些示例说明 URL 在最终产品中的外观;

   New Submission:
http://www.web.com/n/?url=http://www.google.com      [Outputs new URL as 12345]
   Visit the ID directly:
http://www.web.com/1A2b34D5                       [Forwards to URL Destination]
   Visit the ID Preview Link:
http://www.web.com/1A2b34D5/v             [Displays preview, Delayed Forwarder]
4

1 回答 1

1

如果您想url从查询字符串中获取变量,只需添加QSA到选项中,它将保存 url$_GET['url']

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f   # if the url file does not exist
RewriteRule ^n/?$ actions.php?do=new [NS,L,NC,QSA]
RewriteRule ^([a-zA-Z0-9]+)$ actions.php?id=$1 [NC,L]
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$  actions.php?id=$1&do=$2 [NC,L]

同样在您的 actions.php 中,您必须设置条件:

if (isset($_GET['do']))
{
    if ($_GET['do'] == 'new') // http://www.web.com/n/?url=http://www.google.com
    {
        if (!isset($_GET['url'])) die('No url');

        // save the url
        // and outputs new URL
    }
    else if ($_GET['do'] == 'v') // http://www.web.com/1A2b34D5/v
    {
        // Visit the ID Preview Link
    }
}
else // http://www.web.com/1A2b34D5
{
    // Visit the ID directly
}

编辑:

我不知道发生了什么,但就像我在评论中所说的那样,我已经在我的 localhost 中进行了测试,它可以按您的预期工作,在我的测试中,即使我创建了一个具有相同内容的文件,我也test.php有这个内容以下是我测试过的一些 url 示例:var_dump($_GET);actions.php

示例 1:

http://localhost/n?url=google.com或者 http://localhost/n/?url=google.com

这条规则被执行:

RewriteRule ^n/?$ actions.php?do=new [NS,L,NC,QSA]

输出:

array(2) { ["do"]=> string(3) "new" ["url"]=> string(10) "google.com" }

示例 2:

http://localhost/n12345输出:array(1) { ["id"]=> string(6) "n12345" } http://localhost/nnnn456输出:array(1) { ["id"]=> string(6) "nnnn456" }

这条规则被执行:

RewriteRule ^([a-zA-Z0-9]+)$ actions.php?id=$1 [NC,L]

示例 3:

http://localhost/n12345/v输出:array(2) { ["id"]=> string(6) "n12345" ["do"]=> string(1) "v" }

这条规则被执行:

RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ actions.php?id=$1&do=$2 [NC,L]

于 2013-03-25T01:55:20.953 回答