15

I have this structure: site.com/api/index.php. When I send data to site.com/api/ there is no issue, but I imagine it would be better if the api would work without the trailing slash also, like this: site.com/api. This causes a 301 redirect and thus loses the data (since data isn't forwarded). I tried every re-write I could think of and couldn't avoid the redirect. This is my current re-write rule (though it may be irrelevant).

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$ api/index.php [L]

Can I make this url work and maintain the post data without using the trailing slash?

Some rewrites that didn't work: (all still redirect)

RewriteRule ^api$ api/index.php [L] 
RewriteRule ^api/*$ api/index.php [L]
4

2 回答 2

13

您首先需要关闭目录斜杠,但是有一个斜杠非常重要的原因:

Mod_dir 文档

关闭尾部斜杠重定向可能会导致信息泄露。考虑 mod_autoindex 处于活动状态(Options +Indexes)DirectoryIndex设置为有效资源(例如index.html)并且没有为该 URL 定义其他特殊处理程序的情况。在这种情况下,带有斜杠的请求将显示该index.html文件。但是没有斜杠的请求会列出目录内容。

这意味着访问一个不带斜杠的目录只会列出目录内容,而不是提供默认索引(例如index.php)。所以如果你想关闭目录斜杠,你必须确保在内部重写尾部斜杠。

DirectorySlash Off

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api/(.*)$ api/index.php [L]

第一条规则确保尾部斜杠被附加到末尾,尽管只是在内部。与外部重定向浏览器的 mod_dir 不同,内部重写对浏览器是不可见的。下一条规则然后执行 api 路由,并且由于第一条规则,保证有一个尾部斜杠。

于 2013-09-05T00:12:34.663 回答
0

如果您不想使用 Jon Lin 提供的解决方案(重新配置所有指向目录的 URL),您可以使用以下代码(注意正则表达式中的 ? - 它基本上表示“api”后面的斜杠是可选的)。我没有测试过它,但它应该可以正常工作:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/?(.*)$ api/index.php [L]
于 2013-09-05T00:27:22.767 回答