【问题标题】:Site structure with user friendly urls具有用户友好网址的网站结构
【发布时间】: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


【解决方案1】:

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

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

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

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

您可能需要提前制定一些规则,以排除对您的 css、图像和 javascript 进行重写。

【讨论】:

  • 谢谢@Marshmellow1328 所以规则RewriteRule ^(.*)/products/$ http://localhost/.../public_html/pages/products/index.php 有效,但需要大量的特异性。我真的在寻找更灵活的东西
  • RewriteRule ^/(.*)/(.*) /pages/$1/$2 怎么样?所以 /products/sub-page 被发送到 /pages/products/sub-page。
  • 如何定义这条规则,能否请您提供 RewriteRule 的两个参数作为示例?
  • 那是重写规则。 "重写规则 &/(.*)/(.*) /pages/$1/$2"
  • 我已经更新了我的原始答案,并提供了更多细节。它与imsiso的基本相同。每页没有特殊规则。这会处理您的所有页面。试一试,让我们知道您遇到了什么问题。我知道它有效,因为我有一个应用程序可以做到这一点。
猜你喜欢
  • 1970-01-01
  • 2013-03-03
  • 1970-01-01
  • 2012-09-24
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2013-08-10
相关资源
最近更新 更多