2

我正在编写一个 mod 重写规则,以只允许任意长度字符之间的一个句点。字符必须以字母开头,后跟 2-29 个字符或数字,中间只允许有一个句点(可选)(但不能在末尾)。

这是我到目前为止所拥有的:

RewriteCond    %{REQUEST_FILENAME}        !-f
RewriteCond    %{REQUEST_FILENAME}        !-d
RewriteRule    ^([a-z]([.a-z0-9]{2,29}))$    user.php?u=$1     [NC,QSA,L]

此规则不起作用,因为它允许f.oo(valid)、foo.(invalid)、f.o.o(invalid) 甚至f.......

是否可以仅使用 apache 的 mod rewrite 来完成?还是必须在 PHP 或其他地方进行检查?

类似的问题: thisthis

谢谢你。

4

2 回答 2

1

我不知道如何在一个正则表达式中做到这一点,但你可以堆叠你的正则表达式

^[a-z][.a-z0-9]{2,29}$     #3-30 characters long, starting with a letter, then nums
^[a-z0-9]+\.?[a-z0-9]+$    #has zero or one dot in middle

更新以考虑数字

http://regex101.com/r/nD2lI6

http://regex101.com/r/gR3vA1

所以完整的例子应该是这样的:

RewriteCond    %{REQUEST_FILENAME}        !-f
RewriteCond    %{REQUEST_FILENAME}        !-d
RewriteCond    %{REQUEST_URI}  ^[a-z][.a-z0-9]{2,29}$
RewriteRule    ^([a-z0-9]+\.?[a-z0-9]+)$     user.php?u=$1     [NC,QSA,L]
于 2012-12-24T08:16:32.060 回答
1

我不能在一个规则中做到这一点,所以我使用了两个:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 ^.{3,30}$
RewriteRule ^([a-z][a-z0-9]*(?:\.[a-z0-9]+)?)$ user.php?u=$1 [NC,QSA,L]
于 2012-12-24T08:43:12.697 回答