好的,所以我知道这个问题标题有点模糊,之前必须得到解答,但我花了好几个小时看各种解决方案,但没有一个能够回答我想要的内容。
好的,所以即时创建一个类似于此的导航结构的网站 -
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
答案 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进行重写。