虽然我很喜欢编写脚本和编程的东西,但我从未真正理解的是正则表达式。
我正在调整使用site.com/username/p/seo-friendly-link网址结构的第三方脚本。我希望它是site.com/username/seo-friendly-link而不是
其.htaccess文件
RewriteRule ^([A-Za-z0-9_-]+)/p/(.*)$ ./dir/pages/post.php?user=$1&pid=$2
RewriteRule ^p/(.*)$ ./dir/pages/post.php?pid=$1
当我删除/ p为
时RewriteRule ^([A-Za-z0-9_-]+)/(.*)$ ./dir/pages/post.php?user=$1&pid=$2
我将apache日志中的错误视为
[error] [client ::1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
我已尝试将L添加到未修改规则的末尾,但仍会出现相同的错误。
我想学习正则表达式,但我觉得这个特殊的例子并不是那么友好的noob,而是会导致更多的混乱。
有人可以解释这两条线的作用,如何获得我需要的东西或为什么它不像看起来那么简单?
答案 0 :(得分:2)
不是.htaccess配置规则的专家,但就正则表达式而言,问题似乎是struct M1:TestTwoDelegate {
var m2 = M2()
weak var delegate:TestOneDelegate? {
didSet {
m2.delegate = self
}
}
涵盖了太多可能的匹配,因为最后^([A-Za-z0-9_-]+)/(.*)$
组实际上匹配任何内容。
换句话说,(.*)
匹配^([A-Za-z0-9_-]+)/(.*)$
和username/p/seo-friendly-link
。它也匹配目标部分username/seo-friendly-link
,可能导致无限重定向。
要限制正则表达式,您应该从第二组中排除dir/pages/post.php?user=$1&pid=$2
。因此,使用/
代替(.*)
而不是[^/]*
,其中[^/]
定义与/
以外的任何字符匹配的character class:
RewriteRule ^([A-Za-z0-9_-]+)/([^/]*)$ ./dir/pages/post.php?user=$1&pid=$2
答案 1 :(得分:0)
将第一行更改为
RewriteRule ^([A-Za-z0-9_-]+)/p/(.*)$ ./dir/pages/post.php?user=$1&pid=$2 [L,NC,R]
这使得url重定向并断言它是要检查的最后一条规则。