我想将我的.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
.
提前致谢!
假设您的
.htaccess
文件当前位于,/var/www/.htaccess
那么您实际上可以将它们组合起来。.htaccess
和<Directory>
容器共享相同的目录“上下文”——它们遵循相同(相似)的语法。换句话说:
但是,如果您要在
<Directory>
容器中使用 mod_rewrite 指令,那么您应该考虑完全禁用.htaccess
(即。AllowOverride None
),因为.htaccess
将覆盖<Dirctory>
容器(默认情况下)并且您的指令将被忽略。这里不需要
<IfModule>
包装器,因为看起来这些指令是强制性的。几个小点...
在正则表达式字符类中使用时,不需要反斜杠转义文字点,因为它在这里没有特殊含义。IE。
[^\.]
是一样的[^.]
。您的指令上的
NC
标志RewriteRule
是多余的,因为您的模式已经匹配大小写字母。您显式启用目录索引 (
Options Indexes
),但您的 mod_rewrite 指令有效地阻止了目录访问。您可能应该禁用目录索引。把这些点放在一起,就变成了:
另一种方法(可能是@ponsfrilus 在评论中建议的)是将您的 mod_rewrite 指令直接添加到容器外部的服务器配置(服务器上下文)或
<VirtualHost>
容器(虚拟主机<Directory>
上下文)中。(请注意,如果您已经在使用<VirtualHost>
容器 - 最好 - 那么您可能需要将这些指令添加到相关<VirtualHost>
容器中。否则,服务器上下文中的指令可能会被覆盖。)这种方法的一个优点是它们不能被
.htaccess
. 但是,如果您.htaccess
无论如何都要禁用(您可能应该这样做 - 因为您正在将这些指令移动到您的服务器配置中),那么这并不重要。此外,在目录上下文之外使用 mod_rewirte 指令可以说是“更简单”。但是,服务器(或虚拟主机)上下文中的 mod_rewrite 指令的语法与目录上下文不同,因此需要稍微更改它们。
由于服务器上下文中的指令处理得更早,在请求映射到文件系统之前,您不能简单地使用
REQUEST_FILENAME
服务器变量来获取请求的文件名(通常在请求被映射到文件系统后保存绝对文件名)。您需要改用前瞻。IE。LA-U:REQUEST_FILENAME
.此外,在服务器上下文中,
RewriteRule
模式匹配的 URL 路径始终是相对于根的 URL 路径,以斜杠开头。而在.htaccess
(目录上下文)中,URL 路径小于目录前缀,因此永远不要以斜杠开头。在这种情况下,您实际上不需要更改任何内容,但请注意,发生的情况略有不同......在服务器上下文中,您最终将重写为 URL 路径,而在.htaccess
您实质上是重写为文件系统路径(除非您设置了RewriteBase
指令)。因此,或者,上述指令可以写成: