如何在网址htaccess中允许一个点?

时间:2019-07-10 22:15:43

标签: php .htaccess mod-rewrite

我从php开始,我想在网址中使用点(。)。例如,具有用户名test.test1的用户应将我指向具有该用户名的用户的个人资料,但我收到一条错误消息,提示未找到对象。但是,如果我使用字母,数字,破折号或下划线,则效果很好。

Here it is working perfectly fine

但是当我在网址中使用点时会发生这种情况: enter image description here

RewriteEngine On

RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?profile_username=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ profile.php?profile_username=$1

这是我所有的.htaccess代码。

1 个答案:

答案 0 :(得分:5)

您的正则表达式与点不匹配。

括号中的字符序列表示“仅将这些字符匹配一次”,其中的+表示“匹配多次”。因此,在请求的URL中仅匹配括号之间定义的字符,该URL不包含点。您应该在字符序列中添加“点字符”。

因此您来自^([a-zA-Z0-9_-]+)$的正则表达式应变为^([a-zA-Z0-9_-.]+)$

RewriteEngine On

RewriteRule ^([a-zA-Z0-9_-.]+)$ profile.php?profile_username=$1
RewriteRule ^([a-zA-Z0-9_-.]+)/$ profile.php?profile_username=$1

为不匹配文件或目录中实际存在的路径,请在几乎与“所有内容”都匹配的规则(包括重写目标(profile.php)之前使用以下条件:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

最终的.htaccess文件如下所示:

RewriteEngine On

# this rule should not match existing files and directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-.]+)$ profile.php?profile_username=$1

# this rule should not match existing directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([a-zA-Z0-9_-.]+)/$ profile.php?profile_username=$1

P.S:我建议您阅读一些有关正则表达式的文章,并使用“ Regex Tester”来学习正则表达式。例如,this site是一个很好的起点,而this是一个很好的在线测试者。