首页 > 解决方案 > 如何在 url htaccess 中允许一个点?

问题描述

我从 php 开始,我想在 url 中使用点 (.)。例如,使用用户名 test.test1 的人应该指出我使用该用户名的用户的个人资料,但我收到一条错误消息,提示找不到对象。但是,如果我使用字母、数字、破折号或下划线,它就可以正常工作。

在这里它工作得很好

但这就是我在 url 中使用点时发生的情况: 在此处输入图像描述

RewriteEngine On

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

这是我拥有的所有 .htaccess 代码。

标签: php.htaccessmod-rewrite

解决方案


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

括号中的字符序列表示“仅匹配这些字符一次”,而括号中的字符+表示“匹配多次”。因此,在请求的 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

PS:我建议你阅读一些关于正则表达式的文章,并使用“正则表达式测试器”来了解正则表达式。例如,这个站点是一个很好的起点,是一个很好的在线测试器。


推荐阅读