【问题标题】:Apache Mod-Rewrite QuestionApache Mod 重写问题
【发布时间】:2009-12-29 00:11:44
【问题描述】:

我在名为 blog 的文件夹中有一个名为 index.php 的 PHP 脚本。共有三种不同的视图。

  1. http://www.myDomain.com/blog/index.php
  2. http://www.myDomain.com/blog/index.php?tags=list 类别
  3. http://www.myDomain.com/blog/index.php?post=name 的帖子

我想根据 URL 更改视图。

  1. /blog 重定向到上面的 1 号
  2. /blog/name-of-category 重定向到上面的 numbe 2
  3. /blog/name-of-category/name-of-post 重定向到上面的第 3 号。

现在我有以下 mod_rewrite 规则。

RewriteRule ^blog$ blog/index.php [L]
RewriteRule ^blog/(.+)/(.+)$ blog/index.php?post=$2 [L]
RewriteRule ^blog/(.+)$ blog/index.php?tags=$1 [L]

这不起作用,我不知道为什么。现在它总是重定向到最后一个 URL:

blog/index.php?tags=$1

并且GET数据包含“index.php”。

另外,如果像这样在最终规则中添加正斜杠:

RewriteRule ^blog/(.+)/$ blog/index.php?tags=$1 [L]

所有重定向都可以正常工作。问题是,如果我想要类别视图,我需要在 URL 末尾有一个正斜杠。

有什么想法吗?我该如何解决这个问题?


感谢您的回复。我发现我的问题是我的脚本放在名为“blog”的文件夹中的副作用。下面是 index.php 的样子:

<?php

define ('BASE_PATH', "../blog/");

include_once(BASE_PATH . 'controller/Controller.php');

$controller = new Controller();
$controller->invoke();

看到问题了吗?因为我的脚本的基本路径是“blog”,所以 mod_rewrite 正在重写我在程序中的所有引用。通过将我的脚本文件夹重命名为 blogScript,它解决了问题。

【问题讨论】:

    标签: apache mod-rewrite url-rewriting


    【解决方案1】:

    在正则表达式中,. 匹配任何字符(包括/ 字符),因此请尝试使用^blog/([^/]+)$ 来匹配除/ 之外的任何字符。

    【讨论】:

    • 那是为了回复,关于.字符
    【解决方案2】:

    你可以这样写。

    RewriteRule ^blog/?$ blog/index.php [L]
    RewriteRule ^blog/(.+?)/(.+?)/?$ blog/index.php?post=$2 [L]
    RewriteRule ^blog/(.+?)/?$ blog/index.php?tags=$1 [L]
    

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多