【问题标题】:Rewrite URL in PHP在 PHP 中重写 URL
【发布时间】:2012-01-10 10:12:09
【问题描述】:

我想重写以下网址

www.mysite.com/mypage.php?userid=ca49b6ff-9e90-446e-8a92-38804f3405e7&roleid=037a0e55-d10e-4302-951e-a7864f5e563e

www.mysite.com/mypage/userid/ca49b6ff-9e90-446e-8a92-38804f3405e7/roleid/037a0e55-d10e-4302-951e-a7864f5e563e

这里的问题是 php 文件可以是任何东西。我必须为 .htaccess 文件中的每个页面指定规则吗?

如何使用 php 中的重写引擎来做到这一点?

【问题讨论】:

标签: php mod-rewrite rewrite


【解决方案1】:

如果要将在浏览器中输入的后一个 URL 重写为第一种格式,则需要使用 .htaccess 文件。

但是,如果您想在 PHP 中生成漂亮的 URL(例如用于链接标签),那么您有两个选择。

  • 首先,您可以直接构建 URL(而不是转换),我认为这是首选。
  • 其次,您可以将第一个(丑陋的)URL 重写为后一个 URL。然后你需要在 PHP 中使用 preg_replace() 。请参阅http://php.net/manual/en/function.preg-replace.php 了解更多信息。基本上,你会想要使用类似的东西

    $rewrittenurl = preg_replace("@mysite\.com\/mypage.php?userid=(([a-z0-9\-]).+)\&roleid=(([a-z0-9\-]).+)$", "mysite.com/userid/$1/roleid/$2", $firsturl);
    

祝你好运!

【讨论】:

    【解决方案2】:

    要使重写规则生效,您必须将其添加到您的 apache 配置中(在 virtualhost 块中):

    RewriteEngine On
    RewriteRule ^([^/]*)/userid/([^/]*)/roleid/(.*)$ /$1.php?userid=$2&roleid=$3 [L,NS]
    

    RewriteRule 基本上接受两个参数。第一个是描述它应该匹配的正则表达式。在这里,它正在寻找请求像/<mypage>/<pid>/roleid/<rid> 这样的网址的用户。第二个参数是它应该在服务器上实际执行请求的位置(在这种情况下,执行请求的是您的 php 文件)。它使用$1$2$3 引用正则表达式中的组。

    【讨论】:

    • 感谢您的回答,但我的问题还有一点。 mypage.php 不一定是适用此规则的页面。它可以是具有上述查询字符串的任何其他页面。我是否必须为每个页面提供规则,还是可以为所有页​​面指定通用规则?
    • @AbishekRSrikaanth,您可以提供页面名称作为规则正则表达式的一部分。我更新了我的答案以显示如何做到这一点。
    • @Abishek:正如 Ben Lee 所说,您可以简单地将通配符用于“something.php”部分。但是,您的问题意味着您想从第一个 URL 转到第二个 URL,反之亦然。如果是这种情况(您希望将第一个 URL 重写为第二个),您应该使用我的 PHP 解决方案而不是 .htaccess。如果您的意思是 .htaccess,您应该编辑您的问题!
    • @BenLee:你为什么暗示主题海报将 mod_rewrite 与 PHP 混淆了?他从未说过他想使用 .htaccess/mod_rewrite。我认为您误读了这个问题……他不想从第二个 URL 转到第一个,而是从第一个转到第二个。例如在 链接中使用 URL。
    • @WillemMulder,我假设 OP 的意思是相反,因为没有人从“漂亮的 url”=>“丑陋的 url”(或“无查询字符串”的方向进行重写" => "有一个查询字符串")。那没有任何意义。因此,我假设 OP 的意思是从第二个 url 重写到第一个 url。 (由于“重写”作为一个概念并不是真正具有方向性的,因此很容易使这些混淆——因此我依靠过去的经验来对方向性做出假设)。
    【解决方案3】:

    不,您不需要为每个 php 文件单独设置规则,您可以在正则表达式中设置文件名变量,如下所示:

    RewriteRule ^(a-z0-9)/userid/([a-z0-9].+)/roleid/([a-z0-9].+)$ $1.php?userid=$2&roleid=$3
    

    【讨论】:

      【解决方案4】:
          RewriteEngine on
          RewriteBase /
          RewriteRule ^mypage\/userid\/(([a-z0-9]).+)\/roleid\/(([a-z0-9]).+)$ www.mysite.com/mypage.php?userid=$1&roleid=$2
      

      【讨论】:

      • 我认为您错过了问题的重点。 OP 说“php 文件可以是任何东西”并且想知道他/她是否需要为每个文件单独的规则。您已经解释了如何制定重写规则,这不是 OP 要求的。
      • 有什么问题?只需删除正则表达式中的“mypage”
      • @Bazzz,这个答案实际上正是 OP 最初要求的。他后来更新了他的帖子,询问如何使其适用于多个页面。
      • @Ben Lee 很公平,我不知道。我只是想帮忙。
      猜你喜欢
      • 2019-07-13
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      相关资源
      最近更新 更多