【问题标题】:apache alias and subdirectoriesapache 别名和子目录
【发布时间】:2012-11-29 23:20:52
【问题描述】:

我有以下结构

/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=example 的 www/public/index.php)。

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

【问题讨论】:

  • 您能否同时显示两个 .htaccess 中的重写?
  • @freedev 这是来自 mysite/api/ RewriteRule ^api/(.*)/(.*)/$ index.php?object=$1&amp;collection=$2 [QSA,L] RewriteRule ^api/(.*)/$ index.php?object=$1 [QSA,L] 的那个(注意:这是“真实的”,不是带有令牌/示例的)

标签: apache alias subdirectory


【解决方案1】:

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

这是最终配置: 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 抽出宝贵时间。

【讨论】:

    【解决方案2】:

    对于 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 配置,因为这会大大降低服务器速度。

    【讨论】:

    • 嗯......它仍然无法正常工作。如果我尝试访问 domain.com/api/user/(应该重写为 /api/index.php?object=user),我在日志[error] [client 10.10.0.6] File does not exist: /var/www/domain.com/api/user 中有以下错误。顺便说一句,apache 服务器位于 NGINX 反向代理之后(但它对于除别名之外的所有重写都非常有效)
    • 我建议在隔离环境(例如您的计算机)中尝试此重写,然后将其复制到您的服务器中。这可以帮助您正确调试请求/响应过程。
    • 谢谢...阅读 rewrite.log 给了我解决方案。正确的重写规则是:RewriteRule ^(.*)/$ /api/index.php?object=$1 [QSA,L]
    • 欢迎您 :),所以如果我理解得很好,在您的情况下,url 的第一部分将在 mysite/api/ 下被剥离
    • 是的。听起来这是别名的行为。但老实说,我没有进一步调查,现在它起作用了;)
    猜你喜欢
    • 2015-09-06
    • 1970-01-01
    • 2010-10-16
    • 2020-10-03
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    相关资源
    最近更新 更多