来自url目录的PHP文件请求

时间:2013-09-29 20:35:57

标签: php .htaccess directory

这可能是一个非常简单的问题。无论如何,如何在没有请求的情况下使用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?

7 个答案:

答案 0 :(得分: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)和以下网址进行试用:

输出始终为:

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

解决方案

您有三个主要选项:

  1. 添加真实文件未重定向的条件
  2. 仅重写数字,例如重写issue/123但不是issue/abc
  3. 同时执行
  4. 方法1

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

    方法2

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

    方法3

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

    检索ID

    这是一个简单的部分......

    $issueid = $_GET['id'];
    

答案 1 :(得分:1)

在你的.htaccess中你应该添加:

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

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

答案 2 :(得分:0)

您必须使用名为.htaccess的文件,在Google上进行搜索,然后您会找到很多如何实现这一目标的示例。

答案 3 :(得分:0)

您需要mod_rewrite(或平台上的等效文件)才能将/get.php/id/123重写为/get.php?id=123

答案 4 :(得分: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()它并在其各个部分工作。

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

此外,看到自己的答案,您不需要任何preg_math个es。如果您的数据库只包含数字ID,则将其拒绝为非数字ID。如果由于某种原因您仍需要检查字符串var是否具有数值,请考虑is_numeric()

保持简单。不要重新发明轮子!

答案 5 :(得分:0)

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

issue.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");
}
?>

答案 6 :(得分:0)

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

根据Apache手册:

  

RewriteBase指令指定要用于的URL前缀   per-directory(htaccess)替换a的RewriteRule指令   相对路径。

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'];

从网址中检索您的ID。