如何在没有尾部斜杠的情况下访问目录的index.php并且不能获得301重定向

m59*_*m59 13 php apache .htaccess mod-rewrite redirect

我有这种结构: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]
Run Code Online (Sandbox Code Playgroud)

我可以使这个网址工作并维护帖子数据而不使用尾部斜杠吗?

一些不起作用的重写:(所有仍然重定向)

RewriteRule ^api$ api/index.php [L] 
RewriteRule ^api/*$ api/index.php [L]
Run Code Online (Sandbox Code Playgroud)

Jon*_*Lin 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]
Run Code Online (Sandbox Code Playgroud)

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