我正在建立一个网站,该网站(理想情况下)允许用户使用格式为“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]
应该可以工作。当句点属于字符类(即,在括号[
和之间]
)时,它将被视为真正的句点,而不是元字符,因此在这种情况下您不需要对其进行转义。
另一方面,连字符在字符类中确实具有特殊含义(除非它是该类中的第一个或最后一个字符,参见上面的第二个例子)。