php - 如何在 url htaccess 中允许一个点?
问题描述
我从 php 开始,我想在 url 中使用点 (.)。例如,使用用户名 test.test1 的人应该指出我使用该用户名的用户的个人资料,但我收到一条错误消息,提示找不到对象。但是,如果我使用字母、数字、破折号或下划线,它就可以正常工作。
RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ profile.php?profile_username=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ profile.php?profile_username=$1
这是我拥有的所有 .htaccess 代码。
解决方案
您的正则表达式与点不匹配。
括号中的字符序列表示“仅匹配这些字符一次”,而括号中的字符+
表示“匹配多次”。因此,在请求的 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:我建议你阅读一些关于正则表达式的文章,并使用“正则表达式测试器”来了解正则表达式。例如,这个站点是一个很好的起点,这是一个很好的在线测试器。
推荐阅读
- python - TensorFlow pycharm 中的 GPU 警告
- c# - 当高度绑定到 StackPanel 时,UserControl 中的文本框正在锁定应用程序
- python - 您如何通过 Flask 中的 Stripe Checkout 流程携带像 userID 这样的变量?
- java - 试图从arraylist打印信息,但我认为我正在获取内存
- javascript - JQuery滑块不与用d3垂直绘制的数据交互
- html - 如何在 CSS 中堆叠表格中仅一行的 TD 元素?
- linear-programming - 如何在 GPL 线性规划 (Gusek) 中将变量绑定为负数?
- javascript - 为什么 CSS 过渡不会在 ReactJS 中正确呈现?
- c# - 从存储库中提取时,Visual Studio 2017 丢失了 WPF 的引用
- express - 摩根与 Express 不记录静态文件