使用 htaccess 搜索“.”时遇到问题

使用 htaccess 搜索“.”时遇到问题

我正在建立一个网站,该网站(理想情况下)允许用户使用格式为“www.mysite.com/ThisLanham”的 URL 访问其他用户的主页,其中“ThisLanham”是用户名。用户名以字母开头,可以由任何字母数字字符以及下划线、连字符或句点组成。

到目前为止,当我忽略句点字符的使用时,重定向工作正常。以下代码处理该请求:

RewriteRule ^([a-zA-Z][0-9a-zA-Z-_]*)/?$ Page/?un=$1 [NC,L]

不过,我也尝试了多种方法来检查时间段,但都导致了 500 内部服务器错误。以下是我的一些尝试:

RewriteRule ^([a-zA-Z][0-9a-zA-Z-\_\\.]\*)/?$ Page/?un=$1 [NC,L]
RewriteRule ^([0-9a-zA-Z-\_\\.]\*)/?$ Page/?un=$1 [NC,L]
RewriteRule ^([a-zA-Z].\*)/?$ Page/?un=$1 [NC,L]
RewriteRule ^(.\*)/?$ Page/?un=$1 [NC,L]

也試過了…

RewriteCond $1 != index.php
RewriteRule ^([a-z][0-9a-z-_.]*)/?$ Page/?un=$1 [NC,L]

我的备用计划是不再允许用户在用户名中包含句点,但我更希望找到一个解决方案。有什么想法吗?

答案1

http://articles.sitepoint.com/article/apache-mod_rewrite-examples

RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule .? http://www.example.com%{REQUEST_URI} [R=301,L]

这里,为了表示 {HTTP_HOST} 是 Apache 变量,我们必须在其前面添加一个 % 字符。正则表达式以 ! 字符开头,如果与模式不匹配,则会导致条件为真。我们还必须对点字符进行转义,以便它匹配文字点而不是任何字符,就像点元字符的情况一样。我们还添加了 No Case 标志,使此操作不区分大小写。

也许这有帮助?

答案2

根据文档对于 Perl 的正则表达式(Apache 使用的就是它),

RewriteRule ^([a-zA-Z][0-9a-zA-Z\-_.]*)/?$ Page/?un=$1 [NC,L]

或者

RewriteRule ^([a-zA-Z][0-9a-zA-Z_.-]*)/?$ Page/?un=$1 [NC,L]

应该可以工作。当句点属于字符类(即,在括号[和之间])时,它将被视为真正的句点,而不是元字符,因此在这种情况下您不需要对其进行转义。

另一方面,连字符在字符类中确实具有特殊含义(除非它是该类中的第一个或最后一个字符,参见上面的第二个例子)。

相关内容