我有这样的结构:site.com/api/index.php
。当我向site.com/api/
发送数据时没有问题,但我想如果api在没有尾部斜杠的情况下工作会更好,例如:site.com/api
。这会导致301重定向,从而丢失数据(因为数据不会被转发)。我尝试了每一次我能想到的重写,无法避免重定向。这是我目前的重写规则(尽管可能无关紧要)。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$ api/index.php [L]
我可以使这个网址工作并维护帖子数据而不使用尾部斜杠吗?
一些不起作用的重写:(所有仍然重定向)
RewriteRule ^api$ api/index.php [L]
RewriteRule ^api/*$ api/index.php [L]
答案 0 :(得分:13)
首先需要关闭目录斜杠,但有一个原因是为什么有一个尾随斜杠是非常重要的:
关闭尾部斜杠重定向可能会导致信息泄露。考虑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路由,并且由于第一个规则,保证有一个尾随斜杠。
答案 1 :(得分:0)
如果您不想使用Jon Lin提供的解决方案(重新配置指向目录的所有URL),您可以使用以下代码(请注意正则表达式中的? - 它基本上表示&#之后的斜杠) 34; api"是可选的)。我没有测试它,但它应该按原样运行:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/?(.*)$ api/index.php [L]