网站结构与用户友好的网址

时间:2013-04-02 01:48:19

标签: php regex .htaccess codeigniter web

好的,所以我知道这个问题标题有点模糊,之前必须得到解答,但我花了好几个小时看各种解决方案,但没有一个能够回答我想要的内容。

好的,所以即时创建一个类似于此的导航结构的网站 -

导航结构

Home
Products
    Overview
        Feature sub-page
        Feature sub-page
        Feature sub-page
    Videos
    Demonstrations
Training
...

所以到目前为止我的想法是拥有一个文件结构:

文件结构

resources/
    config.php
public_html/
   index.php
   menu.php
   head.php
   footer.php
   css/
   images/
   js/
   pages/
       home/
           index.php
           home.php
       products/
           index.php
           sub-page.php
           sub-page.php
           videos.php
           demonstrations.php
       training/
           index.php
       ...

所以我使用带路径变量的config.php来维护链接。 对于使用

的每个“类别”
pages/CATEGORY/index.php?page=XXX

我真正想要的是一种构建我的文件或设置.htaccess的方法,以便它提供干净的网址,如下所示:

products home page -  mysite/products/
products video page - mysite/videos  OR  mysite/products/videos
products sub-pages -  mysite/products/sub-page

能够屏蔽我的实际文件结构,并且当products / index.php这样的页面有$ _GET变量时,要将url变为:

mysites/products/sub-page

我当然看过mod_rewrite,并且正在考虑像

这样的东西
RewriteRule products/sub-page products/index.php?page=sub-page-name 

可能会工作,但不会回答掩蔽文件夹结构(即''pages')。对于每个具有正则表达式的“类别”,这将需要至少一个规则

只是为了澄清:所有pages / categories / index.php包含所有to。level .php部分(head,menu,footer,ect)和顶级index.php只包含pages / home / index的include .PHP

注意:我还需要在子页面中支持404页面,这样如果我使用

index.php?page=sub-page-name 

子页面实际上并不存在,它显示有效的消息,甚至只是恢复到默认的index.php内容(对现有文件或“已批准值”列表的变量进行条件检查)

- 编辑 -

所以我现在看的解决方案是:

RewriteRule ^(.*)/products/$ http://.../public_html/pages/products/index.php
RewriteRule ^(.*)/products/videos$ http://.../public_html/pages/products/index.php?page=videos
RewriteRule ^(.*)/products/demonstrations$ http://.../public_html/pages/products/index.php?page=demonstrations

但这只能解决问题的一部分(而且对我的喜好有点过于具体,但如果绝对需要,我可以忍受)

当我在做子页面时,这个数字很大并且可能会发生变化。我可以使用

而不是为每个子页面做1条规则
RewriteRule ^(.*)/products/info/(.*)$ http://.../public_html/pages/products/index.php?product=XXX

即使我让用户自己传递变量'?product',我也会写

RewriteRule ^(.*)/products/?product(.*)$ http://.../public_html/pages/products/index.php?product=$1

或类似的?

另外,我需要双向工作,所以如果他们使用完整的网址(即?page),则会更改为已屏蔽的网址

- 编辑 -

所以我现在使用CodeIgniter php框架,它是一个非常轻的mvc框架,它不会对你强制执行太多严格的规则,它也允许我将它放在我的routes.php中:

$route['products/info/(:any)'] = "products/view_info/$1";
$route['(:any)/(:any)'] = "$1/view/$2";
$route['(:any)'] = "$1/view";

,当与我的.htaccess结合使用时:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L] 

解决了我的问题。

我现在没有太严格地使用它,在我的videos.php页面中仍然有一堆javascript控制我的youtubeapi请求,但我可以将其转换为model.php和jquery ajax hybred,如果我能得到我的模型.php很容易吸引而不会让我把我所有的api处理代码重写为php

1 个答案:

答案 0 :(得分:0)

让顶级index.php控制所有页面。所以/ products / sub-page将被重写为/index.php?page=%2Fproducts%2Fsub-page。我认为你的重写规则看起来像这样:

RewriteRule ^(.*)$ index.php?page=$1

然后你的index.php看起来像这样:

include( 'pages'.$_GET['page'] );

您可能需要先提供一些规则,以排除对css,图片和JavaScript进行重写。