this是一个很好的参考。总结相关部分:
在
的SO质疑你是指,在OP想index.php?page=mobile
成为index/page/mobile
和接受这个问题的答案是:
RewriteEngine on
RewriteBase /cashearn/
RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC]
RewriteRule^index/page/%1? [R=302,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^index/page/([^/]+)/?$ index.php?page=$1 [L,QSA,NC]
在为了理解这是如何工作的,我们来仔细看看这个部分:
RewriteCond %{THE_REQUEST} /index\.php\?page=([^\s&]+) [NC]
RewriteRule^index/page/%1? [R=302,L]
RewriteCond是一个必须匹配的条件才能使用后续的RewriteRule。 模式匹配使用正则表达式完成。基础很容易掌握,所以我建议你看看它。在任何情况下,形式%N
(例如%1
)的任何形式都是对当前条件集合中的最后一个RewriteCond的模式的“分组”部分的反向引用。 “分组”部分用圆括号表示。换句话说,RewriteRule中的%1
指的是RewriteCond中的([^\s&]+)
。
看着正则表达式:
正则表达式中的方括号表示一个字符类,所以[^\s&]
因此是一个字符类。 插入符号^
当它是里面字符类表示否定。 \s
是空格字符的转义码。因此,总而言之,[^\s&]
表示“除空白以外的任何字符”和“&
”。字符类附加了+
,意思是“一个或多个”。所以,正则表达式模式将匹配字符类中包含的字符之一。对于url而言,这基本上是指字母,数字和%
的任意组合。
除了“服务器变量”%{THE_REQUEST}
之外,RewriteRule和RewriteCond中的其他字符都是正则表达式的特殊字符或文字。 (文字我的意思是ab
在正则表达式将匹配字符串cab
。)
^
,当不在字符类内时,插入符号是一个特殊字符,表示一行的开始。注意?
和.
这里也是文字,尽管它们包含在正则表达式“特殊字符”列表中。那是因为他们逃脱了\
。
唯一剩下解释为标志[NC]
和[R=302,L]
NC
指不区分大小写。 L
表示最后,即如果匹配,则后续规则将而不是被处理。 'R'表示“重定向”,302
是重定向的HTTP状态码。
内部和外部重定向之间的区别与此处相关。通过内部重定向,服务器将静静地从新形成的URL指定的文件路径中获取资源,而用户仍然可以在浏览器中看到原始URL。 R
标志表示外部重定向,这会导致用户使用新形成的URL启动新的HTTP事务。省略R
用于内部重定向。
嗯。这似乎并没有改变网址。不知道为什么。 – gin93r 2014-11-06 16:34:32
你在浏览器中输入什么URL?你想在浏览器中看到'example.com/prefix-suffix.html?v = huzzah',还是想在浏览器中看到'example.com/prefix/suffix/huzzah'? – anubhava 2014-11-06 16:39:32
最终结果是我想在浏览器中看到'example.com/prefix/suffix/huzzah'。 – gin93r 2014-11-06 16:42:45