我需要一些正确的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字符串。
如何正确重定向此类网址?
答案 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路径将为./
- 但是,这仍然可以被操作系统正确解析并“正常工作”。