Apache vhost:Alias和RewriteRule

时间:2018-04-25 18:14:55

标签: apache .htaccess unix alias virtualhost

我有一个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

问题

  1. 到底是什么意思?为什么error_log中的文件不一样 作为我浏览器上显示的那个?
  2. 为什么apache无法加载正确的文件/srv/www/new/php/file.php,因为.htaccess会问它?
  3. 如果需要,请随时向我提供更多数据。我想明白!

    注意:/foo/bar/things中没有.htaccess;我在我的虚拟主机中尝试过很多东西,比如添加<directory>等等。

1 个答案:

答案 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]