url重写中$ = 1的含义是什么?

时间:2015-09-03 17:58:33

标签: php .htaccess mod-rewrite

我无法在stackoverflow或google上找到有关www.website.com/profile.php?simon 含义的任何信息。我得到的是肤浅的信息,但对于像我这样的初学者来说却没有。它做了什么?

如果我有这样的话:

$1

名称simon是否与(.*) profile/profile.php?变量相对应,为什么1

这就是我理解的方式:

  • www.website.com/profile.php? ID = $ 1

粗体对应于:

  • www.website.com/profile/simon ID =西蒙

使用重写转换成:

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

我在这里错过了什么吗?

编辑:

{{1}}

这是否会改变

本地主机/测试/的index.php?菲利普 至: 本地主机/测试/简档/菲利浦

我试图输入网址但是失败了。我理解正则表达式的作用,但不知怎的,我完全混淆了替换的工作方式。

4 个答案:

答案 0 :(得分:3)

向引用:

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(见下文)。这些可用于创建RewriteRule替换参数或RewriteCond TestString 参数。

     

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

     

图1显示了为了扩展而转移后引用的位置,以及说明RewriteRuleRewriteCond匹配的流程。在接下来的章节中,我们将探索如何使用这些反向引用,所以不要担心,如果它起初对你来说有点陌生。

     

enter image description here

  

这是否会改变

     

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

答案 1 :(得分:2)

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

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

这个

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

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

当只有一个捕获组时。带编号的后向引用为$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 /之后没有文本,它将不会处理重写。

答案 2 :(得分:1)

让我试着用非专业人士的术语来解释。

让我们说你通常会链接到这样一个页面......

/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请求第一个查询字符串参数,并将其附加到这样的网址... your-domain.com/2146_east_fifth_street

您在网址栏中看到的内容不是...... your-domain.com/listing.php?id=2146_east_fifth_street

修改

重写规则的第二部分是" real"页面位于。

如果你想要你的网址阅读/ profile / philip

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

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

答案 3 :(得分:0)

.htaccess $1中的

是对组的反向引用,通常来自正则表达式语句。 每个组都有自己的引用,所以重写如

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

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

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

依旧......

当ID号和网址是动态的时,它会有所帮助。因此您无需逐个手动添加它们。

示例网址:

 website.com/profile/idealcastle/25555

然后在php或其他语言中,你可以拉出这些" url段"。就像使用"查询"参数,?id=simon使用适当的网址进行搜索引擎优化会更好。