如何将.htaccess 代码添加到 apache2.conf?

如何将.htaccess 代码添加到 apache2.conf?

我想将我的.htaccess代码添加到/etc/apache2/apache2.conf

我想将这些结合起来:

.htaccess文件。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]
</IfModule>

/etc/apahce2/apache2.conf文件。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>



问题是我不知道在哪里添加htaccess代码。我该如何合并这些文件?
我正在使用Ubuntu 18.04
提前致谢!

答案1

假设你的.htaccess文件当前位于,/var/www/.htaccess那么你实际上可以结合它们.htaccess<Directory>容器共享相同的目录“上下文”——它们遵循相同(相似)的语法。

换句话说:

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^([^\.]+)$ $1.php [NC,L]
    </IfModule>
</Directory>

但是,如果您要在<Directory>容器中使用 mod_rewrite 指令,那么您应该考虑.htaccess完全禁用(即AllowOverride None),因为.htaccess将覆盖<Dirctory>容器(默认情况下)并且您的指令将被忽略。

这里不需要<IfModule>包装器,因为这些指令看起来是强制性的。

一些小问题...

  • 在正则表达式字符类中使用时,无需使用反斜杠转义文字点,因为它在这里没有特殊含义。即[^\.]与 相同[^.]

  • NC你的指令上的标志是RewriteRule多余的,因为你的图案已经匹配小写和大写字母。

  • 您明确启用了目录索引 ( Options Indexes),但您的 mod_rewrite 指令仍然有效地阻止了目录访问。您可能应该禁用目录索引。

综合以上几点,结果如下:

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^.]+)$ $1.php [L]
</Directory>

另一种方法(可能是 @ponsfrilus 在评论中建议的)是将 mod_rewrite 指令直接添加到服务器配置中(服务器上下文)或<VirtualHost>容器(虚拟主机上下文)- 在<Directory>容器之外。(请注意,如果您已经在使用<VirtualHost>容器 - 最好 - 那么您可能会需要将这些指令添加到相关<VirtualHost>容器中。否则,服务器上下文可能会被覆盖。)

这种方法的一个优点是它们不能被覆盖.htaccess。但是如果你无论如何都要禁用.htaccess(你可能应该这样做 - 因为你要将这些指令移动到你的服务器配置中),那么这并不重要。此外,在目录上下文可以说是“更简单”。

然而,mod_rewrite 指令的语法服务器(或者虚拟主机)上下文不同于目录因此需要稍加改变。

由于指令服务器上下文被更早地处理,请求被映射到文件系统,你不能简单地使用REQUEST_FILENAME服务器变量来获取请求的文件名(通常保存绝对文件名请求已映射到文件系统)。您需要改用前瞻。即LA-U:REQUEST_FILENAME。。

此外,在服务器上下文,URL 路径RewriteRule 图案匹配的始终是相对于根目录的 URL 路径,以斜杠开头。而在.htaccess(a目录上下文中),URL 路径小于目录前缀,因此不会以斜杠开头。在这种情况下,您实际上不需要更改任何内容,但请注意,情况略有不同...服务器上下文中你最终会重写为一个 URL 路径,而.htaccess本质上你是重写为一个文件系统路径(除非你设置了RewriteBase指令)。

因此,上述指令也可以写成:

RewriteEngine On
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [L]

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

相关内容