htaccess RewriteRule匹配URL路径中的特殊字符

时间:2017-08-29 21:39:27

标签: .htaccess mod-rewrite

我需要一些正确的RewriteRule

的帮助

最后需要带有JSON字符串的网址:

http://hns/log/r/%7B"start":%5B55.70980850022872,37.505353142456336%5D,"end":%5B55.70980850022872,37.77039830847196%5D,"points":%5B%5B55.67529029803404,37.62070958776883%5D%5D,"method":"1","optimization":"1","center":%5B55.731512133266634,37.71615331335479%5D,"zoom":10%7D

重定向到

http://hns/log/r/index.html

不在浏览器中更改网址。

.htaccess是:

RewriteEngine on
RewriteBase /log/r/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^/]+)$ ./index.html?catalog=$1[L]
RewriteRule ^([A-Za-z0-9?;:,{}\"]+)$ ./index.html [L]

适用于以下网址:http://hns/log/r/,132a。 但不适用于以下网址:http://hns/log/r/,132a:或引号(")或JSON字符串。

如何正确重定向此类网址?

1 个答案:

答案 0 :(得分:0)

看起来你可能正在Windows机器上测试它?在Windows操作系统中,冒号(:)和引号(")字符不允许使用文件名字符。因此,当Apache尝试将请求映射到文件系统路径时(如果/log/r是文件系统目录,它会执行),您将收到错误(这可能导致Apache服务403 Forbidden),无论你的mod_rewrite正则表达式,已包含这些字符。

Windows上的其他禁用文件名字符:\/:*?",{{1} },<>

如果您需要在Windows上使用此功能,则需要更改网址结构。例如。使用PATH_INFO或查询字符串。

但是,现有代码应该已经在Linux机器上运行|(包含冒号)或带引号(http://hns/log/r/,132a:)字符的URL。

  

"

但是,发布的代码不适用于上面给出的表单的JSON字符串,因为您没有包含所有必需的字符。您遗失了http://hns/log/r/%7B"start":%5B55.70980850022872,37.505353142456336%5D,"end":%5B55.70980850022872,37.77039830847196%5D,"points":%5B%5B55.67529029803404,37.62070958776883%5D%5D,"method":"1","optimization":"1","center":%5B55.731512133266634,37.71615331335479%5D,"zoom":10%7D[](点/句点)。请注意,. 模式与%-decoded网址路径匹配。所以,这应该写成如下:

RewriteRule

另请注意,我已移除RewriteRule ^([A-Za-z0-9?;:,{}"\[\].]+)$ index.php [L] 替换上的./前缀。不需要使用RewriteRule进行前缀(并且不严格正确)。如果以./ mod_rewrite为前缀,只需将 substitution 视为相对(即,它不是以斜杠或方案+主机名开头),而只是应用目录前缀。在这种情况下,生成的URL路径将为./ - 但是,这仍然可以被操作系统正确解析并“正常工作”。