【发布时间】:2013-03-23 04:42:45
【问题描述】:
好的,所以我知道这个问题的标题有点含糊,之前必须已经回答过,但是我花了几个小时研究各种解决方案,但没有一个能完全回答我在寻找什么。
好的,所以我正在制作一个导航结构类似于此的网站 -
导航结构
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
或类似的?
另外,我需要这两种方式都可以使用,这样如果他们使用完整的网址(即使用?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 中与 this 结合使用时:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php/$0 [PT,L]
解决了我的问题。
我现在并没有太严格地使用它,我的videos.php页面中仍然有一堆javascript控制我的youtubeapi请求,但我可以将它转换为model.php和jquery ajax混合,如果我能得到我的模型.php 可以轻松融入,而不会导致我将所有 api 处理代码重写为 php
【问题讨论】:
-
试试这个希望对你有帮助。 stackoverflow.com/questions/15723942/rewriting-an-apache-redirect-rule/15724022#15724022
-
抱歉,我试过了,但不是我要找的。我对其进行了调整并更改了我的 url,但实际上它正在改变浏览器指向的位置。我只想掩盖/掩盖变量和“页面”部分,但仍然返回正确的响应。也许我只是做错了;)
-
好的。但首先我的英语不太好。然后你想做的只是删除.php?
-
不,那也是,但我真的很想设置它,以便我的用户只能看到我想要的路径 - 即。 mysite/products/sub-page - 当请求实际上是 - mysite/pages/products/index.php?page=sub-page-name - 这似乎正是 mod_rewrite 帮助做的,我查看了实际的 mod_rewrite doco尽管如此,仍然无法让它按我的意愿工作。我也愿意更改文件结构等,如果有帮助的话,但我仍然需要能够屏蔽我的实际请求 url
-
@Damascus 既然你找到了自己的解决方案,你可以把它写成一个实际的答案并接受它,即使它是你自己的!这有助于保持 Stack Overflow 整洁,而不是混淆问题与答案。
标签: php regex .htaccess codeigniter web