3

我需要一个 .htaccess 文件,无论它是放在根文件夹还是子文件夹中都可以正常工作,无需修改。下面的脚本是我一直试图适应但没有成功的正常脚本。我在根目录和子文件夹上尝试了htaccess rewrite index.php的解决方案,但无法正常工作。

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
</IfModule>

布局

.htaccess
index.php
subfolder1
- .htaccess
- index.php

路线/blah应该去/index.php/subfolder1/whatever应该去/subfolder1/index.php。目前,上述脚本会将/subfolder1/whatever发送到/index.php

[更新]

这也适用于 subfolder1 下的任何路径,例如/subfolder1/1/2/3/idunno

4

1 回答 1

1

如果您使用的是 Apache 2.2.16 及更高版本,则可以停止使用 mod_rewrite,尽管它非常有用且功能强大,但可能会变得一团糟。

在 mod_dir 中引入了一个新指令FallbackResource,它就是这样做的,如果文件系统没有命中,则重定向到您选择的 uri。只要为AllowOverride Indexes配置中的目录指定,它就可以在 .htaccess 文件中使用。

由于 .htaccess 文件是深度优先评估的,因此您只需让每个 .htaccess 文件描述当前目录中的后备资源,并且子目录中的资源subfolder1优先:

子文件夹 1/.htaccess:

FallbackResource index.php

.ht 访问:

FallbackResource index.php

他们都是一样的,而且工作得恰到好处。

尽管这个指令已经存在了几年,但它似乎还不为人所知,它的目标正是以一种优雅的方式解决这个问题。

该设置只有一个限制。在根目录或 subfolder1 的不存在的子目录中调用 url 将产生子请求递归并随后产生错误 500,因为回退资源是给定目录的本地资源。
最好的方法是使用绝对 uris(以“/”开头)作为 FallbackResource 的参数,这就是为什么要求本身有点奇怪,并且可能与 Apache 的内部工作不兼容的原因。

于 2013-09-23T21:06:35.343 回答