我需要一些关于正确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
——然而,这仍然可以由操作系统正确解析并"工作"。