4

我有以下结构

/var/www/mysite/public/
/var/www/mysite/api/

在这两个目录中,都设置了 .htaccess 来重写 url,如下所示:

dev.domain.com/example/ => dev.domain.com/index.php?token=example

dev.domain.com/api/example => dev.domain.com/index.php?token=example

我的 apache conf 看起来像这样

...
<VirtualHost *:80>
   Servername dev.domain.com
   DocumentRoot /var/www/mysite/public/
   Alias /api/ "/var/www/mysite/api/"
   <Directory "/var/www/mysite/api/">
       Options Indexes FollowSymLinks
   </Directory>
</VirtualHost>
...

dev.domain.com/api/工作正常(它调用 www/api/index.php),但dev.domain.com/api/example/使用查询字符串 token= 调用公共站点(www/public/index.php例子)。

我认为 apache 指令 Alias 也在重定向子目录,显然不是这样。有人能告诉我我哪里错了吗?

4

2 回答 2

5

所以这是一个重写的问题:别名目录不应该在要匹配的模式中。

这是最终配置:apache配置文件

...
<VirtualHost *:80>
        ServerName dev.domain.com
        DocumentRoot /var/www/mysite/public/

        Alias /api/ /var/www/mysite/api/
        <Directory /var/www/mysite/api/>
             Options FollowSymLinks -Indexes   
             AllowOverride all
        </Directory>
</VirtualHost>
...

和 .htacess 文件 /api/ 目录

Options FollowSymLinks
RewriteEngine On

RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301]

RewriteRule ^(.*)/(.*)/$ /api/index.php?object=$1&collection=$2 [QSA,L] 
RewriteRule ^(.*)/$ /api/index.php?object=$1 [QSA,L]

感谢@freedev 抽出宝贵时间。

于 2012-11-30T10:41:53.643 回答
3

对于 mysite/api/ 你应该使用绝对路径,请尝试这些重写:

RewriteRule ^api/(.*)/(.*)/$ /api/index.php?object=$1&collection=$2 [QSA,L] 

RewriteRule ^api/(.*)/$ /api/index.php?object=$1 [QSA,L]

如果有任何事情没有按预期工作,请记住您可以调试启用重写日志的重写过程

RewriteLog "/var/apache/logs/rewrite.log"
RewriteLogLevel 7 

请注意仅在开发环境中使用 rewritelog 配置,因为这会大大降低服务器的速度。

于 2012-11-30T02:56:46.097 回答