我无法在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?菲利普 至: 本地主机/测试/简档/菲利浦
我试图输入网址但是失败了。我理解正则表达式的作用,但不知怎的,我完全混淆了替换的工作方式。
答案 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显示了为了扩展而转移后引用的位置,以及说明
RewriteRule
,RewriteCond
匹配的流程。在接下来的章节中,我们将探索如何使用这些反向引用,所以不要担心,如果它起初对你来说有点陌生。
这是否会改变
localhost/test/index.php?philip
来:localhost/test/profile/philip
不,它将localhost/test/profile/philip
更改为localhost/profile/index.php?id=philip
。假设规则位于“profile”目录中的htaccess文件中,则:
localhost/test/profile/philip
/test/profile/philip
philip
philip
既不是目录也不是文件,则规则与(.*)
匹配,并捕获字符串philip
/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)
$1
中的是对组的反向引用,通常来自正则表达式语句。 每个组都有自己的引用,所以重写如
RewriteRule /profile/(.*)/([0-9]) /profile/index.php/$1/$2
$1
将等于该组(.*)
的值
$2
等于([0-9])
的值,只能包含数字
依旧......
当ID号和网址是动态的时,它会有所帮助。因此您无需逐个手动添加它们。
示例网址:
website.com/profile/idealcastle/25555
然后在php或其他语言中,你可以拉出这些" url段"。就像使用"查询"参数,?id=simon
使用适当的网址进行搜索引擎优化会更好。