【问题标题】:How do you create URL paths without using directories with PHP?如何在不使用 PHP 目录的情况下创建 URL 路径?
【发布时间】:2012-08-27 17:28:50
【问题描述】:

我正在尝试在 PHP 中创建 URL,并在 if 语句 中使用路径 ($path)。

在工作中,我们使用 ASP Classic 并有一些文件允许我们执行以下操作:

<%
 if path = "checkout" then

 <!--#include file="ViewCheckout.asp"-->

 elseif path = "billing" then

 <!--#include file="ViewBilling.asp"-->

 end if
%>

我们几乎可以在我们网站的任何地方使用'if path = "checkout"'。奇怪的是,'http://myworksite.com/checkout/' 是 checkout 页面的 URL,但我们的服务器上没有名为“checkout"... 以上只是我们的 'start.asp' 中出现的 'if path = "blah"' 列表中的几个(该文件包含页面的基本模板)。

我见过像 ParseURL.asp 和其他文件(在工作中)以某种方式创建这些 URL 并允许我们在全球范围内使用它们。我正在尝试了解这是如何在 PHP 中完成的(在工作中,我们运行 Windows Server,我有一个 Linux 机器)。

我要做的是为各自的页面创建以下 URL:

我想再次创建这些 URL,不为路径创建目录。

我已经阅读了 *http_build_url* 和 *parse_url*,但我很难确定以上述方式创建 URL 的方式。

我发现的 http_build_url 教程显示了这一点:

<?php
echo http_build_url("http://user@www.example.com/pub/index.php?a=b#files",
    array(
        "scheme" => "ftp",
        "host" => "ftp.example.com",
        "path" => "files/current/",
        "query" => "a=c"
    ),
    HTTP_URL_STRIP_AUTH | HTTP_URL_JOIN_PATH | HTTP_URL_JOIN_QUERY | HTTP_URL_STRIP_FRAGMENT
);
?>

问题是,我不知道这只是将 ftp://ftp.example.com/pub/files/current/?a=b&a=c 输出为文本还是这是一种创建有效 URL 的方法...(这显然是一个 FTP 地址...) - PHP.net

注意: 在工作中,我们还可以使用 if path = "contact" 来包含某些 sn-ps,如下所示:

<%
 if path = "contact" or path = "chat" or path = "checkout" then

 <div id="communication-nav">
  <ul>
   <li>Some link 1</li>
   <li>Some link 2</li>
   <li>Some link 3</li>
  </ul>
 </div>

 end if
%>

如果有人能给我一些关于如何使用 PHP 重新创建它的指示,我将非常感激!

我是否在研究正确的功能?我需要使用某种 URL Re-write 功能吗?

【问题讨论】:

标签: php apache url-rewriting


【解决方案1】:

尝试在您的 index / document_root 文件夹中创建包含此内容的 .htaccess 文件

  RewriteEngine on

  # If your site is running in a VirtualDocumentRoot at http://example.com/,
  # uncomment the following line:
  # RewriteBase /

  # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
  # -- only if not a file
  RewriteCond %{REQUEST_FILENAME} !-f
  # -- only if not a directory
  RewriteCond %{REQUEST_FILENAME} !-d
  # -- never for favicon
  RewriteCond %{REQUEST_URI} !=/favicon.ico
  # -- rewrite if all above remains true
  # -- e.g. /perma-links/this-is-it  becomes index.php?q=perma-links/this-is-it
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

对于不允许或不可用覆盖重写模块的兼容性设置,请使用以下代码包装代码块:

<IfModule mod_rewrite.c>
     #rewrite rules
</IfModule>

【讨论】:

  • 在这里查看 IIS 是如何工作的 rewrite learn.iis.net/page.aspx/461/…
  • 您提供的代码是否会生成类似 mysite.com/about/ 或 mysite.com/inde.php?q=$1 的 URL?
  • 所以你在这里给我的代码与我需要的相反。如果我想将“mysite.com/motocross/index.php?page=about”转换为“mysite.com/motocross/about/”,我该怎么做?我已经学会了如何做许多其他的 mod_rewrites,但没有一个显示如何做上述......
  • 我很想看看如何在不手动为每个单独的 url 创建 RewriteRule 的情况下做到这一点......
  • 顺便说一句,这也有效。早些时候,我误解了最后一行。我认为 'index.php?q=$1 [L,QSA]' 是结果,但事实并非如此。感谢@mschr 的帮助!
【解决方案2】:

如果您安装了 mod_rewrite,请尝试以下 .htaccess 文件。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/([^/]*) $1.php

【讨论】:

    【解决方案3】:

    经过大量研究,我想出了如何以我需要的方式执行此操作...首先,我插入了一些使 index.php 文件“动态”的代码。我把它放在要显示每个页面的“内容”的地方......

    <?
        $p = $_GET['page'];
    
    $page = "pages/".$p.".php";
    
    if(file_exists($page))
        include($page);
    elseif($p=="")
        include 'pages/home.php';
    elseif($p=="about")
        include 'pages/about.php';
    elseif($p=="contact")
        include 'pages/contact.php';
    elseif($p=="disclaimer")
        include 'pages/disclaimer.php';
    else
        include '404.html';
    ?>
    

    它的作用是包含我想要显示的适当“内容”文件,具体取决于某人试图查看的页面。我将不同的页面存储在我网站的/pages/ 目录中。您可以将其更改为您想要的任何内容。

    接下来,(如果您正在运行 APACHE 服务器并且正在运行 mod_rewrite 模块(大多数托管服务和 APACHE 盒子都启用了此模块)我们要打开(如果您的站点目录中不存在,则创建).htaccess 文件. 这可以用记事本或dreamweaver 完成。只需将文件命名为“.htaccess”并确保不要将其另存为“.txt”。

    .htaccess 文件需要包含以下内容才能实现我所需要的...

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

    ^ 标记字符串的开始,(.*) 基本上指定任何内容都可以在这里,/ 是 /about/(还有更多内容),$ 标记我相信字符串的结尾。

    注意 $ 之后的空格...在空格之后,您说明当前的 URL 是什么(这是我的答案开头的代码块生成的)...在我的如果是 index.php?page=about。 $1 不是 PHP 变量,它代表 第一个变量的值,即 about(或您正在查看的任何页面) .

    现在我强烈建议在深入研究之前先查看“mod_rewrite”教程。这对我来说是新的,而且很混乱。这个视频对我很有帮助 (http://www.practicalecommerce.com/articles/394-Video-Tutorial-Eliminating-Dynamic-URLs-with-Mod-Rewrite)。

    在这里感谢大家的帮助!一如既往,非常感谢! :)

    注意一旦我完成了这个配置,我的 CSS 就完全坏掉了,我的图片都没有出现。我玩弄了hrefs并拨通了它。显然,这些虚假的“目录”会影响 href,就好像它们存在一样?无论如何,如果您遇到这种情况,请不要惊慌:)

    【讨论】:

    • 是的! :) 当然,您需要在 index.php 中创建一个 fork,但是看到您在“/pages”下创建了文件,那么 RewriteCond 会禁止重写(文件存在 == true)。这种技术最常用于控制器模式的含义,如果 url 的第一部分是“用户”,那么数据库表“用户”就是目标等
    • RewriteCond %{REQUEST_FILENAME} !-f 条件是为了确保 CSS、JS 和图像等仍然可以访问,并且不会简单地重写为 index.php
    • 哦,我明白了。我今天可能会修改我的文件并了解更多关于 RewriteCond 和 mod_rewrite 的信息。对于工具箱来说,这似乎是一个非常有用的工具:)
    猜你喜欢
    • 1970-01-01
    • 2021-08-24
    • 2011-06-29
    • 2016-07-08
    • 1970-01-01
    • 2014-01-21
    • 2021-06-19
    • 2015-09-24
    • 2014-07-30
    相关资源
    最近更新 更多