0

不确定是否有合理的方法可以做到这一点,或者我是否遗漏了一些东西。我有一个我构建的内容管理系统,它通过模板系统传递所有内容(它本质上是一个执行处理的单个 PHP 文件)。考虑到这一点,以下规则将向 lucy.php 发送请求,其中验证了 url 并加载了适当的模板。

RewriteRule ^$ lucy.php [L,QSA]
RewriteRule ^([^/\.]+)/?$ lucy.php?section1=$1 [L,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/?$ lucy.php?section1=$1&section2=$2 [L,QSA]
RewriteRule ^([^/\.]+)/([^/\.]+)/([^/\.]+)/?$ lucy.php?section1=$1&section2=$2&section3=$3 [L,QSA]

因此,URL 的每一部分都作为 section# 变量发送到脚本。我的问题是当我使用需要自己的 URL 系统的模板时。在这种情况下......一个博客。通常,我会做类似的事情

RewriteRule ^blog/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/\.]+)/?$ site/blog.php?year=$1&month=$2&day=$3&blog_url=$4 [L,QSA]

将请求发送到一次性脚本。我现在这样做的方式是http://domain.com/blog仍将通过前面提到的 lucy.php 脚本来加载和显示博客模板。那么,是否可以继续允许将请求的 /blog 部分路由到适当的重写规则,但也可以将年、月、日和 blog_url 字段附加到查询字符串?/blog url 不会始终相同,甚至可能不会被称为博客,所以我需要一些可以动态工作的东西。

我唯一的想法是复制 lucy.php 重写的每个实例,以包含基于日期的结构的可选参数。就像是...

RewriteRule ^([^/\.]+)/([0-9]{4})/([0-9]{2})/([0-9]{2})/([^/\.]+)/?$ lucy.php?section1=$1&year=$2&month=$3&day=$4&item_url=$5 [L,QSA]

但我认为可能有更有效的方法来做到这一点。该约定的另一个问题是我希望它适用于其他场景,如类别、作者和其他非博客场景。我不想为这些实例中的每一个复制 lucy.php 重写块。想法?

4

1 回答 1

1

传递完整的 URL,然后用 PHP 解析它,而不是写出新的规则

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /lucy.php?url=$1 [QSA,L]

编辑:

在 PHP 中,我使用这个...

    function parseUrl(){

    $tempArray  = explode('/', $_GET['url']);

    foreach($tempArray as $section){
        if(stristr($section,':')){
            $tempParamArray = explode(':',$section);
            if(stristr($tempParamArray[1],',')){
                $tempParamArray[1] = explode(',',$tempParamArray[1]);
            }
            $this->parameters[$tempParamArray[0]] = $tempParamArray[1];
        }else{
            if(!empty($section)){                   
                array_push($this->sections,$section);
            }
        }
    }

}

然后我使用像...这样的URLS

/section1/section2/section3/

/博客/日期:01-01-2013/

于 2013-07-02T20:42:01.103 回答