【问题标题】:What does the =$1 mean in url rewriting?=$1 在 url 重写中是什么意思?
【发布时间】:2015-11-29 16:36:24
【问题描述】:

我在stackoverflow 或google 上找不到任何关于=$1 含义的信息。我得到了肤浅的信息,但对于像我这样的初学者却一无所获。它有什么作用?

如果我有这样的事情:

www.website.com/profile.php?simon

名字simon是否对应$1变量和为什么是1

我是这样理解的:

  • (.*) profile/profile.php?id=$1

粗体对应:

  • www.website.com/profile.php?id=simon

改写后变成:

  • www.website.com/profile/simon

我错过了什么吗?

编辑:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_FILENAME}.php -d
RewriteRule ^(.*)$ /profile/index.php?id=$1

有变化吗

localhost/test/index.php?philip 到: 本地主机/测试/配置文件/菲利普

我尝试输入网址,但失败了。我了解正则表达式的作用,但不知何故我完全混淆了替换的工作原理。

【问题讨论】:

  • 这是一个反向引用,在模式中的第一组() 中捕获的内容。如果有另一个组,那就是$2,等等。
  • @AbraCadaver (.*) 意味着与请求匹配的任何内容都必须替换为之后的内容。在我的示例中,profile.php 是否被替换为 id=$1。反向引用到底是什么意思?我的意思是在多远
  • @Asperger 请在我的回答中查看我的示例以获取类似http://www.example.com/profile/philip 的 URL

标签: php .htaccess mod-rewrite


【解决方案1】:

反向引用:

RewriteRule ^.*$ /?id=$1

$1 将是空白

RewriteRule ^(.*)$ /?id=$1

$1 将是 .* 匹配的任何内容

RewriteRule ^(a|b|c)/(d|e|f)$ /?id=$1-$2

$1 可能是 "a"、"b" 或 "c",具体取决于匹配的是哪一个,而 $2 可能是 "d"、" e" 或 "f",取决于哪个匹配。

见:http://httpd.apache.org/docs/trunk/rewrite/intro.html#regex

这里必须记住一件重要的事情:每当您在 Pattern 或其中一个 CondPattern 中使用括号时,都会在内部创建反向引用,它可以与字符串$N%N(见下文)。这些可用于创建RewriteRuleSubstitution 参数或RewriteCondTestString 参数。

RewriteRule 模式中的捕获(违反直觉)可用于所有前面的 RewriteCond 指令,因为 RewriteRule 表达式在各个条件之前进行评估。

图 1 显示了反向引用被传输到哪些位置以进行扩展,并说明了 RewriteRuleRewriteCond 匹配的流程。在接下来的章节中,我们将探索如何使用这些反向引用,所以如果一开始你觉得它有点陌生,不要担心。


有变化吗

localhost/test/index.php?philip 至:localhost/test/profile/philip

不,它会将localhost/test/profile/philip 更改为localhost/profile/index.php?id=philip。假设该规则位于“profile”目录中的 htaccess 文件中,则:

  1. 浏览器输入或点击链接:localhost/test/profile/philip
  2. 请求发送到localhost:/test/profile/philip
  3. 请求通过 apache 的处理管道并应用 mod_rewrite,请求被截断为philip
  4. 假设philip既不是目录也不是文件,则规则匹配(.*),并捕获字符串philip
  5. 然后规则重写请求到/profile/index.php?id=philip

【讨论】:

  • 很好的解释,但我还是有点卡住了。我编辑了我的问题并添加了更多代码。让我知道我是否理解这一点
  • 我将 /test/ 添加到重写中,然后输入了 url localhost/test/profile/index.php?id=philip 但我得到了一个 not found
  • @Asperger 你为什么要去localhost/test/profile/index.php?id=philip?这个概念很简单。重写规则:RewriteRule <THIS> <THAT>THIS 更改为 THAT。您尝试的 URL 是<THAT>。这甚至不在您最初提出的问题的范围内。
  • 你是对的。你确实回答了我的问题。我会在一分钟内投票。我会试着反思我在这里学到的东西
【解决方案2】:

首先,使用 Apache 文档而不是 Google 搜索或论坛会更有帮助。

http://httpd.apache.org/docs/2.2/rewrite/intro.html#regex

还有这个

http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond

现在(.*) 是正则表达式中带括号的捕获组。它表示匹配任何单个字符,星号表示重复0 或更多次。

当只有 1 个捕获组时。编号的反向引用是$1。然后使用或添加的其他捕获组将是$2$3 等等。

对于这个例子

www.website.com/profile/simon

你会得到这个重写规则。

RewriteRule (.*) profile/profile.php?id=$1

但是您的反向引用 $1 不会是 simon,而是 profile/simon,因为您匹配了使用 (.*) 请求的所有字符。

如果你只想匹配simon,你需要像这样使用部分匹配。

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_FILENAME}.php -d
RewriteRule ^profile/(.+)/?$ profile/profile.php?id=$1

那么您的$1 将只是simon,并且该规则不会匹配任何空字符串,这意味着如果 /profile/ 之后没有文本,它将不会处理重写。

【讨论】:

  • 我了解正则表达式的工作原理,因为我学习了一些 php 基础知识,但 htaccess 对我来说真的很新。我现在就试试这个,让你知道
  • localhost/test/profile/simon : 在 XAMMP 上测试时找不到请求的 url
  • rewrite is RewriteRule (.*) profile/profile.php?id=$1
  • 您的 htaccess 文件在哪里,您是否尝试过我的实际示例?
  • htaccess 在测试文件夹中。我正在尝试创建一个虚拟配置文件文件夹。文件夹配置文件不存在。我在浏览器中手动输入名称进行测试。
【解决方案3】:

让我试着通俗地解释一下。

假设您通常会链接到这样的页面...

/listing.php?id=2146_east_fifth_street

然后你创建一个这样的重写规则......

RewriteRule ^([A-Za-z0-9_-]+)$ listing.php?id=$1 [NC,L]

这部分^([A-Za-z0-9_-]+)$ 表示接受任何带有大写字母/小写字母/0-9/下划线/连字符的查询字符串参数

这部分listing.php?id=$1 表示将向浏览器提供哪个页面。 $1 要求输入第一个查询字符串参数并将其附加到 URL,如下所示... your-domain.com/2146_east_fifth_street

这就是您在 URL 栏中看到的内容,而不是... your-domain.com/listing.php?id=2146_east_fifth_street

编辑

重写规则的第二部分是“真实”页面所在的位置。

如果您希望您的网址读取 /profile/philip

您的重写规则将像这样以 /profile/ 开头...

RewriteRule ^profile/(.*)$ path/to/the/real/file/index.php?id=$1

【讨论】:

  • 检查我编辑的问题。我想我明白了,如果我不明白,请告诉我。
  • 我的 XAMMP htdocs 我网站的文件夹是“test”。我是否将其包含在真实网址中的网址中?
  • 否...该站点的所有文件都应位于该文件夹中。对吗?
  • 所以第一部分是检查匹配的正则表达式。在这种情况下,我们将其显式设置为 profile,之后的任何内容(alex、philip、332 等)都是允许的。第二部分是被替换的 url,id=1 是一个占位符,包含与我们的正则表达式匹配的所有内容
  • 我所有的文件,包括 htaccess,都在我的测试文件夹中。名为 test 的文件夹位于 XAMMP 的 htdocs 中。所以我得到 localhost/test/somepage
【解决方案4】:

in .htaccess $1 是对组的反向引用,通常来自正则表达式。 每个组都有自己的参考,所以像

这样重写
RewriteRule /profile/(.*)/([0-9]) /profile/index.php/$1/$2

$1 将等于该组的 (.*) 的值

$2 等于 ([0-9]) 的值,它只能包含数字

等等……

当 id 数字和 url 是动态的时,它会有所帮助。所以你不需要手动一一添加。

示例网址:

 website.com/profile/idealcastle/25555

然后在 php 或其他语言中,你可以拉取这些“url 段”。就像使用“查询”参数一样,?id=simon 最好为 SEO 目的使用正确的 url。

【讨论】:

    猜你喜欢
    • 2010-12-28
    • 2015-05-27
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2016-09-16
    • 2011-01-22
    相关资源
    最近更新 更多