在 Apache 中对相同对象使用位置和目录的原因

在 Apache 中对相同对象使用位置和目录的原因

根据我对 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是被禁止的,对于某些站点,DirectoryFile规范就足够了,不需要任何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

相关内容