我使用前端控制器和以下 htaccess 文件管理大量 PHP 应用程序:
FallbackResource /index.php
是的,这是整个文件(对于每个应用程序)!
但是,一些站点位于子文件夹中,需要进行以下更改:
FallbackResource /subfolder/index.php
正如你可能猜到的,/
开头的意思是路径是相对于站点/虚拟主机的,这里的路径需要是相对于目录的。
(如果我使用mod_rewrite
它而不是mod_dir
,我必须RewriteBase
根据需要以类似的方式将 a 添加到每个子目录。)
我认为我可以通过以下方式解决这个问题:
FallbackResource index.php # No slash!
但是,当站点的重写包含斜杠时,例如,如果应用程序是/store/
并且其中的路径是products/1234
,则 Apache 会查找/store/products/index.php
而不是/store/index.php
并在日志中返回 500 和以下消息:
由于可能的配置错误,请求超出了 10 个子请求嵌套级别的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“LogLevel debug”获取回溯。
我会认为FallbackResource
路径是相对于配置它的 .htaccess 文件的,但它似乎实际上是相对于请求的 URL。
有没有办法FallbackResource
按照我的预期行事?
如果这是答案,我可以按原样使用它,但是如果可以这样做,它将使管理我拥有的站点变得容易得多。这些站点使用具有不同主题和数据库连接的相同基本代码,现在它的工作方式我必须在每次部署新版本的代码时修改 htaccess 文件(因为它已签入 Git)。如果我们可以让某人不必每次都记住进行此修改,那将是非常棒的。
我认为这不容易做到。我已经使用这两个指令中可用的新变量插值尝试了主要配置文件的
DirectoryMatch
各种组合。LocationMatch
尽管类似
FallBackResource index.html
的配置是完全有效的,但我同意 Michael Hampton 的担忧,即任何使用相对 URL 都会导致问题。对于FallBackResource index.html
特定的目录树,index.html 必须始终存在,否则您将获得为index.html
无法找到的请求描述的递归循环。在您的情况下,您需要一个带有 , 的顶级
.htaccess
文件FallBackResource /index.html
,然后FallBackResource /subfoldername/index.html
在每个相关的子文件夹中。生成这些的简单脚本可能是最安全的。
我最初提出这个问题的网站不再存在,但这就是我最终要做的。
我最终将这些站点移动到运行 Nginx 的服务器上,其中所有配置都使用
try_files
指令在服务器的配置文件中完成。以这种方式进行管理要容易得多。我相信解决使用
DirectoryIndex
而不是FallbackResource
可能也有效。以下将匹配/a/script/
文件/some/path/to/a/script/index.py
then/some/path/to/a/script/index.html
then/some/path/to/subfolder/index.py
和 finally/some/path/index.py
。这依赖于DirectoryIndex
尊重绝对路径。重复调用
DirectoryIndex
附加到以前的调用。在我的情况下FallbackResource
没有工作,我偶然发现这是一个解决方案。以上适用于 CGI/Python 文件,但我相信它也适用于您的场景。