好的,所以我知道这个问题的标题有点含糊,之前必须回答过,但是我花了几个小时研究各种解决方案,但没有一个能完全回答我要找的东西。
好的,所以我制作了一个导航结构类似于此的网站 -
导航结构
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