我有一个托管在 Apache 上的旧网站。它有许多网页位于公共 Web 根目录及其子文件夹中。
举个例子,假设这些是仅有的我的 Web 根目录中的文件和文件夹:
publicDocs/
directorywith_no_defaultfile/
some-legacy-flat-page.htm
.htaccess
index.php
some-legacy-flat-page.htm
我想开始使用 Zend MVC一些较新的页面。
我有一个 .htaccess mod 重写规则,以便任何对不存在的文件的请求都会被发送到 MVC 引导文件 (/index.php) 来处理。
使用我当前的设置,以下类型的请求已成功路由到 MVC 引导程序“/index.php”:
- /index.php
- /废话
- /目录没有默认文件/bloo
旧版(平面)页面可以成功处理以下类型的请求
- /一些传统平面页面.htm
- /directorywith_no_defaultfile/some-legacy-flat-page.htm
但是,当我请求一个不存在的文件时,该目录如下:
- /没有默认文件的目录
或者
- /没有默认文件的目录/
我没有将这些路由到 MVC 引导程序,而是收到一个错误:
Forbidden
You don't have permission to access /directorywith_no_defaultfile/ on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
我怀疑这可能与 Apache 处理默认文件的方式有关。
目前解决这个问题的唯一方法是:
- 删除该目录(当该目录包含平面遗留页面时这是不可能的),或者
- 在其中放置一个 index.htm 文件,其中包含包含()引导文件的脚本
您知道哪些 Apache 指令可能导致此“禁止”错误吗?
我可以在 .htaccess 中使用任何指令来告诉 Apache 不要介意目录中缺少默认文件,而只需让 mod-rewrite 来担心?
答案1
这DirectoryIndex 指令的文档包括以下内容:
Note that the documents do not need to be relative to the directory;
DirectoryIndex index.html index.txt /cgi-bin/index.pl
would cause the CGI script /cgi-bin/index.pl to be executed if neither
index.html or index.txt existed in a directory.
因此,在适当的位置添加以下行就可以了:
DirectoryIndex index.html index.php /index.php
调整它以支持您希望正常处理的任何类型的索引文件。只要“/index.php”是最后一个,它就会执行您想要的操作。
答案2
这是我通常在 .htaccess 文件中设置 mod_rewrite 脚本的方式
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
rewriterule ^(.*)$ http://www.domain-name.com/$1 [r=301,nc]
</IfModule>
希望有帮助!