1

这可能是一个非常简单的问题。无论如何,您如何在没有请求的情况下使用来自 url 的变量。例如:

www.mysite.com/get.php/id/123

然后页面从数据库中检索 id 123。

这是怎么做到的?提前致谢!

更新

如果我有以下结构:

support/
        sys/
            issue/
                  issue.php
            .htaccess
            home.php
            etc.....

使用 .htaccess 文件包含:

RewriteEngine On 
RewriteRule ^/issue/(.*)$ /issue/issue.php?id=$1 [L]

为什么我必须输入:

http://www.mysite.com/support/sys/issue/issue/1234

为了加载文件?当我想打字时

http://www.mysite.com/support/sys/issue/1234

另外,一旦文件加载,我如何检索 id?

4

7 回答 7

2

问题

这是一个非常基本/常见的问题,源于您的.htaccess规则正在重写一个包含实际存在的目录的 url...

文件结构

>support
    >sys
        >issue
            issue.php
        .htaccess

(即目录issue.htaccess文件在同一个目录下sys:)

重写问题

然后:

RewriteEngine ON
RewriteRule ^issue/(.*)/*$ issue/issue.php?id=$1 [L]
# Note the added /* before $. In case people try to access your url with a trailing slash

不管用。这是因为(注意:->= 重定向到):
http
://www.mysite.com/support/sys/issue/1234 -> http://www.mysite.com/support/sys/issue/issue.php? id=1234
-> http://www.mysite.com/support/sys/issue/issue.php?id=issue.php

示例/测试

尝试使用var_dump($_GET)以下 URL:

输出将始终为:

array(1) { ["id"]=> string(9) "issue.php" } 

解决方案

您有三个主要选择:

  1. 添加不重定向真实文件的条件
  2. 仅重写数字,例如重写issue/123但不issue/abc
  3. 两者都做

方法一

RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^issue/(.*)/*$ issue/issue.php?id=$1 [L]

方法二

RewriteEngine ON
RewriteRule ^issue/(\d*)/*$ issue/issue.php?id=$1 [L]

方法三

RewriteEngine ON
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^issue/(\d*)/*$ issue/issue.php?id=$1 [L]

检索 ID

这是最简单的部分...

$issueid = $_GET['id'];
于 2013-09-29T23:45:49.700 回答
1

在您的 .htaccess 中,您应该添加:

RewriteEngine On
RewriteRule ^id/([^/]*)$ /get.php/?id=$1 [L]

也像之前提到的海报一样,确保你激活了你的 mod_rewrite。

于 2013-09-29T20:43:36.613 回答
0

您必须使用一个名为 的文件.htaccess,在 Google 上进行搜索,您会发现很多示例如何完成此操作。

于 2013-09-29T20:38:31.303 回答
0

您正在寻找的是PATH_INFO $_SERVER变量。

http://php.net/manual/en/reserved.variables.server.php

'PATH_INFO'

包含在实际脚本文件名之后但在查询字符串之前的任何客户端提供的路径名信息(如果可用)。例如,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar访问的,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff .

explode()它并在其部分工作。

编辑:使用重写规则将用户的请求 URL 映射到您的内部结构和/或隐藏脚本名称。但不要将其转换PATH_INFOGET查询,这是完全没有必要的!只需做一个explode('/',$_SERVER['PATH_INFO']),你就在那里!

另外,看到你自己的答案,你不需要任何preg_mathes。如果您的数据库仅包含数字 id,则给它一个非数字的 ID 将被拒绝。如果由于某种原因您仍需要检查字符串 var 是否具有数值,请考虑is_numeric()

把事情简单化。不要重新发明轮子!

于 2013-09-29T20:44:41.367 回答
0

您将需要mod_rewrite(或您平台上的等价物)重写/get.php/id/123/get.php?id=123.

于 2013-09-29T20:39:19.877 回答
0

只是想知道为什么没有答案提到你关于使用RewriteBase

根据 Apache 手册:

RewriteBase 指令指定用于替代相对路径的每个目录 (htaccess) RewriteRule 指令的 URL 前缀。

RewriteBase在您的中使用/support/sys/issue/.htaccess,代码将很简单:

RewriteEngine On
RewriteBase /support/sys/issue/

RewriteRule ^([0-9+)/?$ issue.php?id=$1 [L,QSA]

然后issue.php你可以这样做:

$id = $_GET['id'];

从 URL 中检索您的 id。

于 2013-09-30T04:19:40.430 回答
0

我尝试并尝试了该.htaccess方法,但无济于事。所以我尝试了一个 PHP 解决方案并想出了这个。

问题.php

<?php
if (strpos($_SERVER['REQUEST_URI'], 'issue.php') !== FALSE){
    $url = split('issue.php/', $_SERVER['REQUEST_URI']);
}elseif (strpos($_SERVER['REQUEST_URI'], 'issue') !== FALSE){
    $url = split('issue/', $_SERVER['REQUEST_URI']);
}else{
    exit("URI REQUESET ERROR"); 
}

$id = $url[1];

if(preg_match('/[^0-9]/i', $id)) {
    exit("Invalid ID");
}
?>
于 2013-09-29T22:03:42.030 回答