如何仅为2个变量获取干净的URL?

时间:2014-10-04 19:23:51

标签: php .htaccess

我已经看过/读过有关.htaccess的干净网址的问题,但对于我的生活,我无法让他们为我的特定需求而工作。我一直收到404消息。

示例:www.mysite.com/article.php?id = 1& title = my-blog-title

我希望网址为:www.mysite.com/article/1/my-blog-title

到目前为止,这是我的.htaccess中的内容:

 Options -MultiViews
#DirectorySlash on
RewriteCond %{HTTP_HOST} !^www [NC]
RewriteRule .* http://www.%{HTTP_HOST}%{REQUEST_URI} [L]


# Rewrite for article.php?id=1&title=Title-Goes-Here 
RewriteRule ^article/([0-9]+)/([0-9a-zA-Z_-]+) article.php?id=$1&title=$2 [NC,L]

#Rewrite for certain files with .php extension
RewriteRule ^contact$ contact.php
RewriteRule ^blogs$ blogs.php
RewriteRule ^privacy-policy$ privacy-policy.php
RewriteRule ^terms-of-service$ terms-of-service.php

另外,这是我如何链接到文章? article.php?id=<?php echo $row_rsBlogs['id']; ?>&slug=<?php echo $row_rsBlogs['slug']; ?>article/<?php echo $row_rsBlogs['id']; ?>/<?php echo $row_rsBlogs['slug']; ?>

我正在使用Dreamweaver,但我手动编码很舒服。

提前致谢。

1 个答案:

答案 0 :(得分:2)

您可以通过告知网络服务器将所有请求重定向到例如,来使用调度程序。的index.php .. 在那里,一个调度实例分析请求并调用某些控制器(例如articlesControllers)

class Dispatcher

{

    // dispatch request to the appropriate controllers/method

    public static function dispatch()

    {

        $url = explode('/', trim($_SERVER['REQUEST_URI'], '/'), 4);

        /*
         * If we are using apache module 'mod_rewrite' - shifting that 'request_uri'-array would be a bad idea :3
         */
        //array_shift($url);

        // get controllers name

        $controller = !empty($url[0]) ? $url[0] . 'Controller' : 'indexController';

        // get method name of controllers

        $method = !empty($url[1]) ? $url[1] : 'index';

        // get argument passed in to the method

        $parameters = array();

        if (!empty($url[2])) {

            $arguments = explode('/', $url[2]);

            foreach ($arguments as $argument) {
                $keyValue = explode('=',$argument);
                $parameters[$keyValue[0]] = $keyValue[1];
            }

        }


        // create controllers instance and call the specified method

        $cont = new $controller;
        if(!method_exists($cont,$method)) {
            throw new MethodNotFoundException("requested method \"". $method . "\" not found in controller \"" . $controller . "\"");
        }
        $cont->$method($parameters);

    }

}

在.htaccess中


RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php