关于url重写

时间:2011-12-07 18:46:51

标签: php .htaccess

我在一个平台上工作,最近遇到了如何重写链接的问题。 首先,我想给你一个例子:

让我们说这是原始链接:

category.php?_uri =类别/子类别/ subcategory2 ...

重写结构是:

domain_path /类别/子类别/ subcategory2 ...

从我看到的大多数主要平台链接都是这样编写的,我的问题是如何使类似的东西?

在我尝试逻辑思考之后,我们得到了类似的东西:

的.htaccess

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

我想与之合作:

$_SERVER["REQUEST_URI"]

但是我不明白如何检查是类别还是文章(因为文章我想使用相同的结构ex:domain_path / article_name)......哪种方法可以调用内容?

3 个答案:

答案 0 :(得分:0)

我建议你这样做

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)(\/([^/]+))?(\/([^/]+))?$
  category.php?category=$1&subcat1=$2&subcat2=$3 [L,QSA]

访问/foo/bar/baz等网址时,您将拥有

$_GET['category'] = foo
$_GET['subcat1'] = bar
$_GET['subcat2'] = baz

答案 1 :(得分:0)

通常,您在RewriteRule文件中捕获带有.htaccess的网址,如上所述,然后使用PHP解析它。使用上面的内容,它会在$_SERVER['REQUEST_URI']变量中,然后您可以开始对其进行操作:

<?php
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
?>

然后,上面会给你一个URL段的数组,在每个正斜杠上分开。你如何解析你的URL取决于你。

通过区分目录页面和说,文章或CMS页面(我认为这是您正在遇到的问题),您可以通过多种方式进行讨论。就个人而言,我通过使用第一个URL段来区分内容。因此可能是/articles/products,依此类推。

<?php
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));

switch ($url_parts[0]) {
    case 'articles':
        // continue parsing the remaining URL parts as article parameters
        list($articles, $year, $month, $day, $slug) = $url_parts;
    break;
    case 'products':
        // continue parsing the remaining URL parts as product parameters
        list($products, $category, $subcategory, $slug) = $url_parts;
    break;
    // and so on...
}
?>

答案 2 :(得分:0)

如果您使用category.phparticle.php,则可以执行此类操作

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

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

最好的方法是通过像这样的单一前控制器

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]

然后,您需要在配置中定义路径并检查所请求的URL(来自$_SERVER['REQUEST_URI'])。

您可以查看Zend_Router的工作原理并遵循类似的模式