在 AliasMatch 上找不到 DirectoryIndex
DirectoryIndex not found on AliasMatch
来自 documentation 我有这个:
AliasMatch "^/projects/(.+)" "/var/www/domain.name//public"
它应该只匹配像 ../projects/project1
这样的 URL,而不是 ../projects/
本身。
当我说,http://example.org/projects/project1/
它 returns 一个 403 Forbidden
。日志说因为:
No matching DirectoryIndex found, and server-generated directory index forbidden by Options directive
.
我试过在虚拟主机中明确添加 DirectoryIndex
但无济于事。我打开目录 (/var/www/domain.name/project1/public
) 以供所有人阅读,现在它只显示我想要的文件夹的目录列表。我可以看到它转到了正确的文件夹并且可以看到 index.html 文件,但它并没有像它应该的那样自动获取它。
我的 VirtualHost 文件的摘要版本:
<VirtualHost *:443>
DocumentRoot /var/www/domain.name/www/public
ServerName www.domain.name
AliasMatch "^/projects/(.+)" "/var/www/domain.name//public"
ErrorDocument 401 err.php
ErrorDocument 404 err.php
ErrorDocument 500 err.php
<Directory /var/www/domain.name>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
如果我随后将特定项目文件夹的权限设置为 755,我只会得到一个目录列表。我已将其改回 711。
/var/www/ 中的所有文件夹都属于 username:www-data 并且具有权限 711.
如果我对文件夹直接使用别名,即 Alias /projects/<actual-project-name> /var/www/domain.name/<project-name>/public
它会起作用。
AliasMatch "^/projects/(.+)" "/var/www/domain.name//public"
问题是 所有 请求都映射到单个 URL - 一个目录。 AliasMatch
不会将尾随路径复制到目标的末尾,这与 Alias
.
不同
当您请求 /projects/project1
时,别名自然会将您映射到 /projects/public
。 mod_dir (DirectorySlash
) 附加一个尾部斜杠(因为这是一个有效的目录),但是目录索引丢失了。目标文件实际上只是 /projects/public/
(目录),如 AliasMatch
指令中所述,而不是似乎需要的 /projects/public/index.html
。
为了使它按预期工作(以便能够访问 "public" 目录 中的所有文件 ,例如 index.php
),那么您需要一个第二个带括号的子模式,例如:
AliasMatch ^/projects/([^/]+)(.*) /var/www/domain.name//public/
来自 documentation 我有这个:
AliasMatch "^/projects/(.+)" "/var/www/domain.name//public"
它应该只匹配像 ../projects/project1
这样的 URL,而不是 ../projects/
本身。
当我说,http://example.org/projects/project1/
它 returns 一个 403 Forbidden
。日志说因为:
No matching DirectoryIndex found, and server-generated directory index forbidden by Options directive
.
我试过在虚拟主机中明确添加 DirectoryIndex
但无济于事。我打开目录 (/var/www/domain.name/project1/public
) 以供所有人阅读,现在它只显示我想要的文件夹的目录列表。我可以看到它转到了正确的文件夹并且可以看到 index.html 文件,但它并没有像它应该的那样自动获取它。
我的 VirtualHost 文件的摘要版本:
<VirtualHost *:443>
DocumentRoot /var/www/domain.name/www/public
ServerName www.domain.name
AliasMatch "^/projects/(.+)" "/var/www/domain.name//public"
ErrorDocument 401 err.php
ErrorDocument 404 err.php
ErrorDocument 500 err.php
<Directory /var/www/domain.name>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
如果我随后将特定项目文件夹的权限设置为 755,我只会得到一个目录列表。我已将其改回 711。
/var/www/ 中的所有文件夹都属于 username:www-data 并且具有权限 711.
如果我对文件夹直接使用别名,即 Alias /projects/<actual-project-name> /var/www/domain.name/<project-name>/public
它会起作用。
AliasMatch "^/projects/(.+)" "/var/www/domain.name//public"
问题是 所有 请求都映射到单个 URL - 一个目录。 AliasMatch
不会将尾随路径复制到目标的末尾,这与 Alias
.
当您请求 /projects/project1
时,别名自然会将您映射到 /projects/public
。 mod_dir (DirectorySlash
) 附加一个尾部斜杠(因为这是一个有效的目录),但是目录索引丢失了。目标文件实际上只是 /projects/public/
(目录),如 AliasMatch
指令中所述,而不是似乎需要的 /projects/public/index.html
。
为了使它按预期工作(以便能够访问 "public" 目录 中的所有文件 ,例如 index.php
),那么您需要一个第二个带括号的子模式,例如:
AliasMatch ^/projects/([^/]+)(.*) /var/www/domain.name//public/