.htaccess
我在子目录中有以下内容:
RewriteEngine on
RewriteRule ^file.js$ file.php
包含上述文件和其他文件的目录如下所示:
dir/
├── index.html
└── js
├── file.php
└── .htaccess
我希望我file.js
的内部重定向到file.php
。
当我有dir
时/var/www/html/
,我的vhost
定义如下所示:
DocumentRoot /var/www/html
<Directory "/var/www/html">
AllowOverride All
Require all granted
</Directory>
#Alias /dir "/tmp/dir"
#<Directory "/tmp">
# AllowOverride All
# Require all granted
#</Directory>
有用!
但是,当我移动dir
并将/tmp/
它更改vhost
为如下所示时:
DocumentRoot /var/www/html
#<Directory "/var/www/html">
# AllowOverride All
# Require all granted
#</Directory>
Alias /dir "/tmp/dir"
<Directory "/tmp">
AllowOverride All
Require all granted
</Directory>
这重定向不再起作用,但我仍然可以访问其他文件,如index.html
。
日志显示重写将添加到DocumentRoot
我的完整路径中file.php
,从而给了我一个文件不存在信息
问题:
我如何编写一个 .htaccess 文件不可知论者到它被放置的位置,只是从一个特定文件到另一个文件进行内部重定向?
请记住,虽然我可以更改主vhost
配置来解决这个问题,我的目标是只使用.htaccess
。
答案1
这最佳实践是将您的配置指令移动到实际的 Apache 配置文件(并完全禁止 .htaccess 文件)。
在这种情况下,这将解决您的问题,因为您不再依赖文件系统位置来使您的指令生效......
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
DocumentRoot /var/www/example.com/
Alias /scripts/ /var/www/scripts/
RewriteEngine on
RewriteRule ^file.js$ file.php
</VirtualHost>
如果你不是系统管理员,并且无权访问你的 Apache 配置,那么你的问题就不会是关于主题.htaccess
但这不是重点,您可以通过在包含的目录中创建一个(复制)文件来解决问题file.js
。取决于AllowOverride
指示为您配置了真正的管理员,您通常可以将 .htaccess 文件放置在 Apache 有权访问的任何目录和子目录中。您不受 DocumentRoot 的限制。