删除.htaccess

时间:2016-05-31 16:32:34

标签: .htaccess mod-rewrite

.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。怎么做才能删除初始的尾随点?

更新 显然我的问题不清楚,我再试一次。

  1. 上面的regexp(RewriteRule)应该分配" J。"到变量$ 1。相反,它指定" J"到$ 1,换句话说,正则表达式会丢弃尾随点。其次,正则表达式指定" Doe"到变量$ 2,这个赋值是预期的和正确的。在数据库搜索中使用变量$ 1(具有不正确的值" J")和$ 2(具有正确的值" Doe")。由于缺少点,此搜索失败。数据库包含" J. Doe",但不是" J Doe"。

  2. 当点不跟踪时,如" J.O",变量$ 1得到正确的值" J.O"。换句话说,正则表达式不会删除所有点,只会删除尾随点。

  3. 我的问题是:我如何判断(重写引擎).htaccess正确应用正则表达式?

    为了进行比较,下面的JS代码可以满足我的需求:

    
    
    var regexp = "^author/([A-z.]+)/([A-z]+)$";
    var result = "author/J./Doe".match(regexp);
    alert(result[1] + " " + result[2]);
    
    
    

1 个答案:

答案 0 :(得分:0)

这显然是(仍然)“功能”:https://bz.apache.org/bugzilla/show_bug.cgi?id=20036

问题:除非路径段正好是“”,否则Apache会删除所有尾随点和空格。或“ ..”。

我遇到了这个问题,因为我尝试将URL从get/a/b/c映射到get.php?param1=a&param2=b&param3=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将路径字符串中的结尾点传递到后端,那么最好的选择是编写一个中间脚本,该脚本提取适当的参数,然后为您执行代理请求。