我想将我的.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>