【问题标题】:Routing URLs in PHPPHP 中的路由 URL
【发布时间】:2011-08-31 01:21:01
【问题描述】:

我正在做一个网页项目。为此,我决定使用 Apache、PHP(5.1.7,我的服务提供商强加的版本)和 Dwoo(模板)。

我想将 URL 路由到我的模板。我知道有很多框架在做这种事情。我只是想知道是否有一个很好的方法来实现它。

我的项目设置如下:

  • src/dwoo - Dwoo 文件
  • index.php - 这应该处理路由。目前它只是使用模板呈现网站的首页。
  • 模板 - 代表实际页面的模板。

业务逻辑数量最少(没有真实模型)。这只是非常静态的页面。使用模板使维护工作更容易(即继承)。

知道在这种情况下如何设置路由吗?我猜理想情况下,每个给定的 URL 都应该通过 index.php 路由,然后以某种方式决定要呈现哪个模板(即 /category/pagename 将映射到 templates/category/pagename.tpl)。

【问题讨论】:

    标签: php apache url-rewriting url-routing dwoo


    【解决方案1】:

    使用mod_rewrite 将所有内容路由到单个index.php 文件。然后检查此文件中$_SERVER['REQUEST_URI'] 中的变量以调度到所需的处理程序。

    此配置将启用mod_rewrite,如果已安装:

    DirectorySlash Off
    Options FollowSymLinks Indexes
    DirectoryIndex index.php
    
    RewriteEngine on
    
    RewriteCond %{REQUEST_FILENAME}  -d
    RewriteRule  ^.*$  -  [L]
    
    RewriteCond %{REQUEST_FILENAME}  -f
    RewriteRule  ^.*$  -  [L]
    
    RewriteRule ^.*$    index.php [L]
    

    【讨论】:

    • 谢谢。是否需要“Options FollowSymLinks Indexes”部分?我的主机似乎失败了(内部服务器错误)。没有它,我在尝试访问索引以外的其他页面时收到“在此服务器上找不到请求的 URL /appname/index.php”。也许忘记 Apache 并弄清楚如何将模板呈现为 HTML 可能会更整洁〜之前〜我将任何内容上传到服务器......
    • FollowSymlinks 仅在您使用符号链接时才需要。它可能不是严格需要的。需要Indexes ,否则请求/ 将不会呈现index.php。当您收到Internal Server Error 时,请查看 Apache 的错误日志以了解问题所在。
    • 离线渲染文件是一个好主意,原因有很多,但实际上它会变得相当复杂。如果你想要这个,我建议你使用现有的包,比如 Jekyll。
    • 好的。我只是为了踢球而试一试。我设法让它生成 HTML 就好了。现在我只需要解决一些路径问题(相对 CSS 等)。 :)
    • "需要索引,否则请求 / 不会呈现 index.php。" - 这是完全错误的。如果没有找到索引文件,Indexes 会启用目录列表。 DirectoryIndex 是使 index.php 可用的指令
    【解决方案2】:

    就像 trolskn (+1) 描述的那样:

    使用mod_rewrite 将所有内容路由到单个index.php 文件。然后检查此文件中$_SERVER['REQUEST_URI'] 中的变量以调度到所需的处理程序。

    但我发现以下.htaccess(与index.php 一起放置在应该“消耗”它之后的所有内容的文件夹中)更有帮助:

    Options -MultiViews
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
    

    另外我想指出你可能会遇到该消息

    .htaccess: Invalid command 'RewriteEngine', perhaps misspelled
    or defined by a module not included in the server configuration
    

    这可以通过sudo a2enmod rewrite && sudo service apache2 restart (source) 轻松解决

    【讨论】:

      【解决方案3】:

      您可能想使用 PEAR 的 Net_URL_Mapper

      【讨论】:

        猜你喜欢
        • 2016-11-12
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 2011-03-15
        • 2017-08-10
        • 2023-04-01
        相关资源
        最近更新 更多