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



我需要一些关于正确RewriteRule的帮助。

需要末尾带有JSON字符串的URL:

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

而不改变浏览器中的URL。

.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]

它可以很好地与以下URL配合使用:http://hns/log/r/,132a。但不适用于像http://hns/log/r/,132a:、引号("(或JSON字符串这样的URL。

如何正确重定向此类URL?

看起来你可能正在Windows机器上测试这个?在Windows操作系统上,不允许使用冒号(:(和引号("(字符作为文件名字符。因此,当Apache试图将请求映射到文件系统路径时(如果/log/r是文件系统目录,它会这样做(,无论您的mod_rewrite regex已经包含这些字符,都会收到一个错误(这可能会导致Apache提供403 Forbidden(。

Windows上禁止使用的其他文件名字符:/:*?"<>|

如果你需要在Windows上运行,那么你需要更改你的URL结构。例如,使用PATH_INFO或查询字符串。

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

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

但是,发布的代码不适用于上面给出的表单的JSON字符串,因为您没有包含所有必要的字符。缺少[].(句点(。请注意,RewriteRule模式与%解码的URL路径匹配。因此,这应该写如下:

RewriteRule ^([A-Za-z0-9?;:,{}"[].]+)$ index.php [L]

还请注意,我已经删除了RewriteRule替换上的./前缀。不需要预先混合./(也不是严格正确的(。如果前缀为./,mod_rewrite只将替换视为相对的(即,它不以斜杠或scheme+主机名开头(,并将简单地应用目录前缀。在这种情况下,生成的URL路径将是/log/r/./index.php——然而,这仍然可以由操作系统正确解析并"工作"。

相关内容

  • 没有找到相关文章

最新更新