0

好的,所以我知道这个问题的标题有点含糊,之前必须回答过,但是我花了几个小时研究各种解决方案,但没有一个能完全回答我要找的东西。

好的,所以我制作了一个导航结构类似于此的网站 -

导航结构

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 的方法,以便它提供干净的 url 看起来像:

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/categories/index.php 包含所有到级别的 .php 部分(头、菜单、页脚等),顶级 index.php 只包含 pages/home/index.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

或类似的?

另外,我需要这两种方式都可以使用,因此如果他们使用完整的 url(即 with ?page),它会更改为被屏蔽的 url

-编辑-

所以我现在使用 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,如果我能得到我的model.php轻松融入,而不会导致我将所有 api 处理代码重写为 php

4

1 回答 1

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 的重写。

于 2013-04-02T02:43:21.523 回答