.htaccess重写规则应用于一个安静的数据库应用程序:
RewriteRule ^author/([A-z.]+)/([A-z]+)$ get_author.php?first_name=$1&last_name=$2
适用于
http://localhost:8080/API/author/J./Doe
从" J中移除句号。"由此产生的名称" J Doe"显然不在数据库中(而#34; J.Doe"是)。此重写规则仅删除尾随句点,例如" J.O"正确翻译为" J.O"。我在Windows 10下使用XAMPP 7.0.6加Apache。怎么做才能删除初始的尾随点?
更新 显然我的问题不清楚,我再试一次。
上面的regexp(RewriteRule)应该分配" J。"到变量$ 1。相反,它指定" J"到$ 1,换句话说,正则表达式会丢弃尾随点。其次,正则表达式指定" Doe"到变量$ 2,这个赋值是预期的和正确的。在数据库搜索中使用变量$ 1(具有不正确的值" J")和$ 2(具有正确的值" Doe")。由于缺少点,此搜索失败。数据库包含" J. Doe",但不是" J Doe"。
当点不跟踪时,如" J.O",变量$ 1得到正确的值" J.O"。换句话说,正则表达式不会删除所有点,只会删除尾随点。
我的问题是:我如何判断(重写引擎).htaccess正确应用正则表达式?
为了进行比较,下面的JS代码可以满足我的需求:
var regexp = "^author/([A-z.]+)/([A-z]+)$";
var result = "author/J./Doe".match(regexp);
alert(result[1] + " " + result[2]);

答案 0 :(得分:0)
这显然是(仍然)“功能”:https://bz.apache.org/bugzilla/show_bug.cgi?id=20036
问题:除非路径段正好是“”,否则Apache会删除所有尾随点和空格。或“ ..”。
我遇到了这个问题,因为我尝试将URL从get/a/b/c
映射到get.php?param1=a¶m2=b¶m3=c
,但是c
可以合法地带有尾随点。该问题实际上与mod_rewrite无关,但也与常规URL相同,例如,文件的示例URL绝对没有这样命名:Example favicon file。其他服务器则不这样做。示例:Stackoverflow favicon file,这使它成为剥离HTTP服务器标头后检测Apache服务器的一种方式。
要变通解决此问题,我仍然使用mod_rewrite映射URL,但是在PHP脚本中,我使用完全相同的正则表达式手动映射参数:
if(preg_match('#/get/([^/]+)/([^/]+)/(.+)$#',$_SERVER['REQUEST_URI'],$matches)){
$param1=$matches[1];
$param2=$matches[2];
$param3=$matches[3];
}
我使用PATH_INFO
而不是使用REQUEST_URI
,因为它没有被修饰。
这意味着如果您绝对需要使用apache将路径字符串中的结尾点传递到后端,那么最好的选择是编写一个中间脚本,该脚本提取适当的参数,然后为您执行代理请求。