【发布时间】:2013-12-15 01:56:29
【问题描述】:
我正在尝试通过 .htaccess 在某个 URL 上应用 RewriteRule,但遇到了问题。
这是我之前针对此特定用途的代码:
RewriteRule ^levels-u-([a-z0-9_-]+)\.html$ levels.php?p=$1&i=u&r=true [QSA,L,NC]
RewriteRule ^levels-u-([a-z0-9_-]+)-\(([a-z]+)\)\.html$ levels.php?p=$1&i=u&n=$2&r=true [QSA,L,NC]
它的工作方式是可能有这个页面:
levels-u-username.html
或此页面:
levels-u-username-(text).html
但用户名的文本也可以包含空格和括号(显示为 +、%5B 和 %5D)。
所以我用这段代码来匹配任意字符组合
RewriteRule ^levels-u-([^/]+)\.html$ levels.php?p=$1&i=u&r=true [QSA,L,NC]
RewriteRule ^levels-u-([^/]+)-\(([a-z]+)\)\.html$ levels.php?p=$1&i=u&n=$2&r=true [QSA,L,NC]
所以现在,这不会输出 404 错误:
levels-u-username+%5Bmore%5D.html(即“用户名[更多]”)
但现在的问题,是后者
levels-u-username-(text).html
将在第一个 RewriteRule 中将“username-(deleted)”重写为 $1,而不是在第二个中使用 $1 = "username" 和 $2 = "text"
我想弄清楚的是如何将加号和括号合并到 .htaccess mod_rewrite 的这个正则表达式中:
([a-z0-9_-]+)
因为
([^/]+)
与另一个 RewriteRule 产生冲突。
同样,这些是我需要添加到表达式中的字符:
“+”、“%5B”(即“[”)、“%5D”(即“]”)
如果可能的话,我的另一个想法是禁用短语“-(”?
【问题讨论】:
-
开启重写日志可能会帮助您了解发生了什么以及为什么...
标签: php regex apache .htaccess mod-rewrite