mod 重写和查询字符串

发布于 2024-08-28 01:23:21 字数 291 浏览 3 评论 0原文

我正在尝试重写 URL 中的一些查询字符串,如下所示:

foo.com/index.php?page=admin&view=news&action=edit&id=3

to

foo.com/admin/news/edit/3

但无法弄清楚...

如果我只有“页面”参数,它也应该有效,因为我并不总是当然,我的网址中有这 4 个参数(页面、视图、操作、id)。

有什么建议吗?

I'm trying to rewrite some query strings I have in my URL like this :

foo.com/index.php?page=admin&view=news&action=edit&id=3

to

foo.com/admin/news/edit/3

But can't figure it out...

it should also works if I only have the 'page' parameters for example, since I don't always have these 4 parameters (page,view,action,id) in my urls, of course.

any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

我做我的改变 2024-09-04 01:23:21

最简单的方法是在 PHP 代码中完成大部分解析。

使用像这样的重写规则

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d    
RewriteRule . index.php [L]

,然后从 PHP 访问请求 uri ($_SERVER['REQUEST_URI']),并将其解析为所需的多个部分。

The easiest way is to do most of the parsing in PHP code.

Use rewriterules like

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d    
RewriteRule . index.php [L]

And then access the request uri ($_SERVER['REQUEST_URI']) from PHP, and parse it into as many parts as you want.

狼性发作 2024-09-04 01:23:21

我编写这段代码是为了将您想要使用的 url 类型解析为参数数组。它很灵活,这意味着您可以在每个页面上以完全不同的方式使用参数。您将需要将其与 Joel L 建议的请求处理程序一起使用。

它还允许理解老式的 $_GET 查询字符串,以防万一,并且它还覆盖 $_SERVER['PHP_SELF'] 以像您期望的那样运行,使用控制脚本的路径而不是整个 url你所有的参数。

我很快将其编辑为独立函数,因此请注意拼写错误。另外,欢迎提出任何改进此代码的建议。

<?php 
function parseRequestUrl($http_server = 'http://example.com'){

    $request = $_SERVER['REQUEST_URI'];
    $request = explode('?', $request);
    if (isset($request[1])){
        $get_data = $request[1];
        parse_str($get_data, $_GET);
    }
    $request = $request[0];

    $url_data = array_values(array_filter(explode('/', $request)));
    $url_level = substr_count($http_server, '/', 8);
    foreach($url_data as $key => $val){
        if($key>$url_level){
            $parameter[] = $val;
        } else if ($key==$url_level){ // controller is also stored at $this->parameter[0]
            $parameter[] = $controller = $val;
        }
    }

    if(!isset($controller) || !$controller){
        $parameter[0] = $controller = 'index';
    }
    $_SERVER['PHP_SELF'] = $http_server.'/'.$controller;

    return $parameter;
}
  ?>

对于 $http_server,请使用您站点的域。

因此,如果您根据以下要求使用此功能:
http://site.com/news/category/arts/page/5

您将得到以下变量:


$parameter[0] => 'news'
$parameter[1] => 'category'
$parameter[2] => 'arts'
$parameter[3] => 'page'
$parameter[4] => '5'

I wrote this code to parse the kind of urls you want to use into an array of parameters. It's flexible, meaning you can use the parameters in totally different ways on every page. You will need it use it with a request handler like Joel L suggested.

It also allows for old-school $_GET query strings to be understood just in case, and it also overwrites $_SERVER['PHP_SELF'] to behave like you expect it to, with the path to the controlling script rather than the entire url with all your parameters.

I quickly edited it for use as a stand alone function, so watch out for typos. Also, any suggestions to improve this code are welcome.

<?php 
function parseRequestUrl($http_server = 'http://example.com'){

    $request = $_SERVER['REQUEST_URI'];
    $request = explode('?', $request);
    if (isset($request[1])){
        $get_data = $request[1];
        parse_str($get_data, $_GET);
    }
    $request = $request[0];

    $url_data = array_values(array_filter(explode('/', $request)));
    $url_level = substr_count($http_server, '/', 8);
    foreach($url_data as $key => $val){
        if($key>$url_level){
            $parameter[] = $val;
        } else if ($key==$url_level){ // controller is also stored at $this->parameter[0]
            $parameter[] = $controller = $val;
        }
    }

    if(!isset($controller) || !$controller){
        $parameter[0] = $controller = 'index';
    }
    $_SERVER['PHP_SELF'] = $http_server.'/'.$controller;

    return $parameter;
}
  ?>

For $http_server use your site's domain.

So if you use this on the request of:
http://site.com/news/category/arts/page/5

You will get the following variable back:


$parameter[0] => 'news'
$parameter[1] => 'category'
$parameter[2] => 'arts'
$parameter[3] => 'page'
$parameter[4] => '5'
燕归巢 2024-09-04 01:23:21

在您的 .htaccess 文件中放入以下两行:

RewriteRule ^/([^/]+)$ index.php?page=$1 [L]
RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ index.php?page=$1&view=$2&action=$3&id=$4 [L]

接下来,不要像“example.com/index.php?var=1&var=2 ...”这样调用您的页面,而是像这样调用它们“example.com/1/2” ……”

In your .htaccess file put these two lines:

RewriteRule ^/([^/]+)$ index.php?page=$1 [L]
RewriteRule ^/([^/]+)/([^/]+)/([^/]+)/([^/]+)$ index.php?page=$1&view=$2&action=$3&id=$4 [L]

Next, instead of calling your pages like "example.com/index.php?var=1&var=2 ..." call them like this "example.com/1/2 ..."

奶茶白久 2024-09-04 01:23:21
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*) index.php?page=$1&view=$2&action=$3&id=$4

除了 mod_rewrite 之外不需要任何东西,所有参数都是可选的。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/?([^/]*)/?([^/]*)/?([^/]*) index.php?page=$1&view=$2&action=$3&id=$4

Requires nothing but mod_rewrite, all parameters are optional.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文