如何访问目录';s index.php不带尾随斜杠,且不获取301重定向

如何访问目录';s index.php不带尾随斜杠,且不获取301重定向,php,apache,.htaccess,redirect,mod-rewrite,Php,Apache,.htaccess,Redirect,Mod Rewrite,我有这样的结构:site.com/api/index.php。当我将数据发送到site.com/api/时没有问题,但我认为如果api也能在没有尾部斜杠的情况下工作会更好,比如:site.com/api。这会导致301重定向,从而丢失数据(因为数据未转发)。我尝试了我能想到的每一次重写,但无法避免重定向。这是我当前的重写规则(尽管可能与此无关) 我可以让这个url工作并维护post数据而不使用尾随斜杠吗 有些重写不起作用:(仍然重定向) 您首先需要关闭目录斜杠,但有一个原因,为什么后面有一个斜杠

我有这样的结构:
site.com/api/index.php
。当我将数据发送到
site.com/api/
时没有问题,但我认为如果api也能在没有尾部斜杠的情况下工作会更好,比如:
site.com/api
。这会导致301重定向,从而丢失数据(因为数据未转发)。我尝试了我能想到的每一次重写,但无法避免重定向。这是我当前的重写规则(尽管可能与此无关)

我可以让这个url工作并维护post数据而不使用尾随斜杠吗

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


您首先需要关闭目录斜杠,但有一个原因,为什么后面有一个斜杠非常重要:

:

关闭尾部斜杠重定向可能会导致信息泄露。考虑MODYAutoCindex为活动<代码>(选项+索引)和 Disturyindex < /C> >的情况被设置为有效资源(例如,“代码>索引。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路由,由于第一条规则,保证有一个尾随斜杠。

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

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

后面的斜杠是由apache模块mod_dir添加的:另外,您的重写规则(以其编写方式)将后面的斜杠作为规则的一部分。您可能只需要从规则中删除
/
,它就可以正常工作了。我在想,我可以将对该目录的请求重写为index.php,这样模块就永远不会启动,但它不起作用。我将更新以显示我在那里尝试的内容。此.htaccess文件位于何处?它必须位于api的父目录中。还有,
-d
可能必须消除这种情况。这意味着,如果请求的文件不是目录,而
/api
是目录,则条件将不匹配。它位于父目录中,我在没有条件的情况下尝试过。这肯定是在启用模块时避免重定向的唯一方法吗?此外,共享主机允许此更改是否常见?我发现他们对某些事情很严格。@m59当mod_dir的
DirectorySlash
打开时,无法避免重定向。您可以通过关闭重定向来避免重定向,但是mod_dir会在mod_rewrite之前处理URI(几乎总是这样),因此没有办法解决这个问题。我现在不知道托管服务对此有多严格。但是
directorysslash
是“索引”覆盖的一部分,所以它们很可能允许这样做。它应该是
^(.*[^/])$$1/
而不带前导斜杠吗?前导斜杠导致我访问上一个directory.Hmmm。总是更复杂的哈哈。我的项目需要可移植。My.htaccess位于应用程序的根目录下,但不在文档根目录下(此时)。无论我在这里做什么,无论应用程序文件夹位于文档根目录还是嵌套目录,它都必须保持功能。如果你想帮我省去思考这个问题的时间,我会很感激的,但如果我要求太多,我会搞砸的!我猜我需要添加一个条件?我确实试过了。可选的斜杠没有帮助,也不能完全删除斜杠。我很确定这不起作用,因为模块会在重写有机会修复它之前启动并重定向。@m59我想你后来被重定向的原因是因为你的浏览器缓存了301响应,所以它会自动重定向到带有尾随斜杠的URL。您应该在curl或新浏览器中进行测试
DirectorySlash Off

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

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