【问题标题】:PHP: Serve pages without .php files in file structurePHP:在文件结构中提供没有 .php 文件的页面
【发布时间】:2010-12-31 13:24:57
【问题描述】:

我正在为客户构建内部 CMS。我没有为每个页面创建一个新的 php 文件,而是想知道是否有一种方法可以基于 URL 加载页面,而不是该位置的物理 php 文件。

所以,如果我访问 www.mysite.com/new-page,我希望这只是对我的模板、内容等的引用,而不是实际的 .php 文件。

对不起,如果我没有正确解释这一点,但我很难解释它。

谢谢。

【问题讨论】:

  • 我认为您所指的内容类似于 mediawiki(维基百科上使用的 cms)对吗?如果文章不存在(因此路径不存在),请加载一个页面来帮助您创建一个。
  • 没错,这就是所谓的路由。在 Ruby on Rails、Django、CodeIgnitor 等 MVC 框架中可以找到良好的实现。

标签: php url path


【解决方案1】:

听起来你需要Front Controller pattern

基本上每个 URL 都会被重定向到一个 PHP 页面,该页面决定如何处理它。您可以通过 .htaccess 使用 Apache mod_rewrite

RewriteEngine on
RewriteBase /
RewriteRule !\.(js|ico|txt|gif|jpg|png|css)$ index.php

这会将除静态内容文件之外的所有内容重定向到 index.php。根据需要进行调整。

如果你只是想影响 URL /new-page 然后尝试类似:

RewriteEngine on
RewriteBase /
RewriteRule ^new-page/ myhandler.php

任何以“new-page”开头的 URL 都会被发送到 myhandler.php。

【讨论】:

  • 是的,这听起来确实像我要找的。但是,我真的不希望所有页面都从索引页面提供。我仍然想要像 www.mysite.com/page/page2 和 www.mysite.com/page-test 这样的 URL。你给出的例子能说明这一点吗?
【解决方案2】:

它通常是与您的 PHP 代码一起为您处理此问题的 Web 服务器。因此,例如,如果您使用的是 Apache,您可以使用 mod_rewrite 来执行以下操作:

RewriteEngine on
RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L]

然后在您的 php 代码中,您可以检查 $_GET['page'] 以查看正在调用的页面。

所以访问mysite.com/page/blah 将真正访问index.php?page=blah

【讨论】:

    【解决方案3】:

    使用 mod_rewrite 重写 PHP 页面中的 URL 是解决方案。 我宁愿使用更通用的重写规则来重写任何不接受服务器上现有目录文件的 URL。

    # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多