2

好的,我已经阅读并在这里搜索了一些内容,但还没有找到我的问题的答案,或者我对 url 重写太新了,只是想不通。这是我想要完成的事情:

我有一个包含频道描述和 ID 的表,ID 用于知道要显示的内容,所以我的 URL 中有这样的内容

http://www.mysite.com/page?channel=1

现在我想做的是显示这个:

http://www.mysite.com/page/description

并且仍然能够以某种方式获取该描述的 id 以显示适当的内容。希望这是有道理的。我唯一想到的是在页面顶部,执行以下操作:

select * from channels where description = $_GET['description']

并让它返回 id,然后使用它。那会是唯一的出路吗?还是 .htaccess 足够好?这样的菜鸟:(

编辑:这现在在我的 htaccess 中:

AddType x-mapp-php5 .php
Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

## hide .php extension
# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R,L,NC]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
##This is to redirect just stream page only
RewriteRule ^stream/(.+)/([0-9]+)$ /stream.php?channel=$1
4

2 回答 2

1

如果要获取 ID,请执行以下操作:

  1. 启用 mod_rewrite apache 模块
  2. 在 DocumentRoot 目录中创建 .htaccess
  3. 接下来粘贴:

    RewriteEngine On
    RewriteRule ^([0-9]+)$ /page.php?channel=$1
    
  4. 当您关注 URL 时:

http://www.mysite.com/1

您从 URL 中获取内容:

http://www.mysite.com/page?channel=1

于 2013-02-12T07:54:16.733 回答
0

有很多方法可以做到这一点。

在您的应用程序中使用MVC架构将迫使您以一种或另一种形式使用路由逻辑。

您特别想要的可以通过多种方式完成,包括 apache RewriteMap

我会亲自设计我的应用程序,使其接收 URI 并将它们路由到控制器/页面。这可确保 PHP 继续完全控制请求最终显示的内容。

假设您的任务是在不影响大部分应用程序的情况下美化您的链接,您需要找到一种映射/page/description/page?channel=1.

对于这种独特的情况,我会使用类似于装饰器模式的东西,因为本质上你的任务不需要修改现有的代码库:

.htaccess

RewriteEngine On
RewriteRule ^.*$ router.php [NC,L]

路由器.php

include'config.php';// remove your config loading from index.php

$request = $_SERVER['REQUEST_URI'];
$request = explode('/', $_request);
    # in $request you will have all the uri segments now

/* complex logic to find out what page you're on */

   # assuming we found out it's page/description
$_GET['channel'] = 1;// or getIdFromDescription($request[2])
   # this forces the environment to believe it got a request with ?channel=1

# revert to your old request with injected environment
include'index.php';

这里的前提是 index.php 可以加载你的旧页面。你只需要改变它们的访问方式。因此,您使用路由器将新请求映射到旧请求。

它并不完美,但适用于设计不佳的应用程序。

请注意:我当前的实现不处理静态资源(图像、css、js 等)

于 2013-02-12T07:53:54.657 回答