根据我对 ApacheDirectory
指令的理解,指的是文件系统对象,Location
指的是请求 URI 中的元素。那么如果 URI 与文件系统中的对象匹配,为什么要互换使用 Directory 和 Location 呢?
ScriptAlias /otrs/ "/opt/otrs/bin/cgi-bin/"
Alias /otrs-web/ "/opt/otrs/var/httpd/htdocs/"
<IfModule mod_perl.c>
# Setup environment and preload modules
Perlrequire /opt/otrs/scripts/apache2-perl-startup.pl
# Reload Perl modules when changed on disk
PerlModule Apache2::Reload
PerlInitHandler Apache2::Reload
# general mod_perl2 options
<Location /otrs>
# ErrorDocument 403 /otrs/customer.pl
ErrorDocument 403 /otrs/index.pl
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlOptions +ParseHeaders
PerlOptions +SetupEnv
<IfModule mod_version.c>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
</IfModule>
<IfModule !mod_version.c>
Order allow,deny
Allow from all
</IfModule>
</Location>
# mod_perl2 options for GenericInterface
<Location /otrs/nph-genericinterface.pl>
PerlOptions -ParseHeaders
</Location>
</IfModule>
<Directory "/opt/otrs/bin/cgi-bin/">
<Directory "/opt/otrs/bin/cgi-bin/">
AllowOverride None
Options +ExecCGI -Includes
<IfModule mod_version.c>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
</IfModule>
<IfModule !mod_version.c>
Order allow,deny
Allow from all
</IfModule>
<IfModule mod_filter.c>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/javascript application/javascript text/css text/xml application/json text/json
</IfModule>
</IfModule>
</Directory>
编辑:
谢谢。这是我的理解,但请随时纠正我。我来这里是为了从错误中吸取教训 ScriptAlias /otrs/ "/opt/otrs/bin/cgi-bin/" 指定 CGI 程序的目标目录。
在 /opt/otrs/bin/cgi-bin/ 中我有以下内容:
drwxrwsr-x 4 otrs apache 205 Nov 13 16:39 ..
drwxrwsr-x 2 otrs apache 139 Oct 22 09:27 .
-rwxrwx--- 1 otrs apache 3.4K Sep 28 01:40 app.psgi
-rwxrwx--- 1 otrs apache 1.2K Sep 28 01:40 customer.pl
-rwxrwx--- 1 otrs apache 1.2K Sep 28 01:40 index.pl
-rwxrwx--- 1 otrs apache 1.2K Sep 28 01:40 installer.pl
-rwxrwx--- 1 otrs apache 1.2K Sep 28 01:40 nph-genericinterface.pl
-rwxrwx--- 1 otrs apache 1.2K Sep 28 01:40 public.pl
-rwxrwx--- 1 otrs apache 7.2K Sep 28 01:40 rpc.pl
所以根据我的理解,如果我打电话https://ipv4/otrs/index.pl它将触发位于 /opt/otrs/bin/cgi-bin/ 下的特定脚本
因此,通过该部分,“/opt/otrs/bin/cgi-bin/”下的所有脚本都将具有应用的选项 <Location /otrs> </Location>
。如果我访问https://ipv4/otrs/nph-genericinterface.pl 该部分中的选项<Location /otrs> </Location>
将与其中设置的选项合并 <Location /otrs/nph-genericinterface.pl> </Location>
但是我在下面定义了相同的内容<Directory "/opt/otrs/bin/cgi-bin/">
这是什么原因呢?这两个指令不是指的是完全相同的东西吗?
答案1
和Directory
规范Files
专门适用于文件系统。通常,只允许访问少数目录树。访问某些文件通常.htaccess
是被禁止的,对于某些站点,Directory
和File
规范就足够了,不需要任何Location
规范。这些规范通常用于控制可以访问哪些目录。
Location
规范适用于网络空间(可能包含文件系统中不存在的内容)。这更符合网站的设计,不需要考虑目录路径。这些选项通常指定如何处理特定路径上的内容。
有优先规则和排序规则控制哪些规范将适用。两个Location
块的排序很重要。
设置诸如处理程序之类的东西perl-script
可以在许多位置完成。在某种程度上,选择在哪里设置它需要了解您希望将站点中有多少内容作为 Perl CGI 内容交付。限制访问通常更安全。由于Location
指令会覆盖(在允许的情况下)Directory
指令,因此它们提供的访问权限最少。如果该目录可通过不同的 URL 路径访问,则这些Location
指令将不适用。
原始响应:位置和目录指向同一位置是不寻常的。通常,站点根目录是/var/www
或一些类似的目录。在您的情况下,您似乎正在使用/opt
.
对于otrs
,目录规范是/opt/otrs/bin/cgi-bin
,位置规范是/otrs
。对于“ortr-web”,目录规范为/opt/otrs/var/httpd/htdocs
,位置为/otrs-web
。
如果您扫描 Apache 配置,您应该注意到对目录“/”的访问被拒绝,而对站点根目录的访问被允许。通常,对文件系统的访问是通过Directory
规范来控制的,对 URL 路径的访问也是通过Location
规范来控制的。禁止使用别名规范Location
规范是相对于Docroot
. Location
可以指定磁盘上不存在的虚拟位置,例如/server-status
和/server-info
。