我有一个URL(域),用于多个目录(项目)。当把一个.htaccess放进去时,我有一种非常奇怪的行为。
sub.mywebsite.com/
=> /foo/bar/things
sub/mywesite.com/pro
=> /srv/www/new
虚拟主机:
<VirtualHost *:80>
DocumentRoot /foo/bar/things
ServerName sub.mywebsite.com
Alias /pro /srv/www/new
</VirtualHost>
它完美无缺。当我继续sub.mywebsite.com/
时,它会点击/foo/bar/things
目录,反之亦然。
现在,让我们在.htaccess
中添加一个简单的/srv/www/new
:
RewriteEngine on
RewriteRule ^(.*)/$ php/file.php?text=$1 [L,QSA]
因此,当我继续sub.mywebsite.com/pro/hello/
时,调用的文件应该是/srv/www/new/php/file.php
,并带有GET arg。我仔细检查,规则很好。
这是RewriteLogLevel 4的结尾:
192.168.123.123 - - [25/Apr/2018:19:28:11 +0200] [sub.mywebsite.com/sid#7f317dd08b8][rid#7f37eca9f78/initial] (1)
[perdir /srv/www/new/] internal redirect with /srv/www/new/php/file.php [INTERNAL REDIRECT]
online htaccess checker确认:The new url is http://sub.mywebsite.com/php/file.php%3Ftext=testing
但是我找不到apache 404:
Not Found
The requested URL /srv/www/new/php/file.php was not found on this server.
是的,文件存在ls -l /srv/www/new/php/file.php
。
非常奇怪的部分是这样的:在apache错误日志中,我得到了:
[Wed Apr 25 19:45:30 2018] [error] [client 192.168.123.123] File does not exist: /foo/bar/things/srv
问题:
/srv/www/new/php/file.php
,因为.htaccess会问它?如果需要,请随时向我提供更多数据。我想明白!
注意:/foo/bar/things
中没有.htaccess;我在我的虚拟主机中尝试过很多东西,比如添加<directory>
等等。
答案 0 :(得分:2)
您的两个问题的答案已经显示在您的屏幕和日志中:
The requested URL /srv/www/new/php/file.php was not found on this server.
请求的网址。
AH00128: File does not exist: /foo/bar/things/srv/www/new/php/file.php
文件不存在。
因此,apache不会尝试获取位于文件系统上file.php
文件夹中的文件/srv/www/new/php/
。它正在尝试打开网址http://sub.mywebsite.com/srv/www/new/php/file.php
,它解释了浏览器错误和错误日志中的行,因为对于该网址,它确实应该查看/foo/bar/things/srv/www/new/php/file.php
。
来自http://httpd.apache.org/docs/current/mod/mod_rewrite.html:
重写引擎可以在.htaccess文件中使用 部分,有一些额外的复杂性。
(...)
见 RewriteBase指令,了解有关前缀的更多信息 将被添加回相关替换。
(...)
RewriteBase指令指定要用于的URL前缀 per-directory(htaccess)替换a的RewriteRule指令 相对路径。使用亲戚时,此指令必需 每个目录(htaccess)上下文中替换的路径。
(...)
这种错误配置通常会导致服务器查找 文档根目录下的目录。
解决方案:将RewriteBase "/pro"
添加到.htaccess
您可以在重写日志中看到差异:
没有RewriteBase:
[perdir /srv/www/new/] rewrite 'hello/' -> 'php/file.php?text=hello'
[perdir /srv/www/new/] add per-dir prefix: php/file.php -> /srv/www/new/php/file.php
[perdir /srv/www/new/] internal redirect with /srv/www/new/php/file.php [INTERNAL REDIRECT]
使用RewriteBase "/pro"
:
[perdir /srv/www/new/] rewrite 'hello/' -> 'php/file.php?text=hello'
[perdir /srv/www/new/] add per-dir prefix: php/file.php -> /srv/www/new/php/file.php
[perdir /srv/www/new/] trying to replace prefix /srv/www/new/ with /pro
strip matching prefix: /srv/www/new/php/file.php -> php/file.php
add subst prefix: php/file.php -> /pro/php/file.php
[perdir /srv/www/new/] internal redirect with /pro/php/file.php [INTERNAL REDIRECT]