如何让 Apache 的别名“/foo”/path/to/foo 在 nginx 中工作

如何让 Apache 的别名“/foo”/path/to/foo 在 nginx 中工作

我正在尝试在 HHVM 前面配置 nginx 来提供一个 API,该 API 有一个登录页面,列出了 / 处的可用版本以及 /api/[version]/ 处实际安装的 API 版本。

我的 nginx 配置到目前为止如下:

server {
    listen *:80;
    server_name api.domain.com;

    # Character Set
    charset utf-8;

    # Logs
    access_log /www/vhosts/api.domain.com/logs/access_log.nginx;
    error_log /www/vhosts/api.domain.com/logs/error_log.nginx;

    # Directory Indices
    index index.php;

    # Document Root
    root /www/vhosts/api.domain.com/public;

    # Location
    location /assets {
        try_files $uri $uri/ =404;
    }
    location /api/1.0 {
        root /www/vhosts/api.domain.com/api/1.0/public;
        rewrite ^/api/1.0(.*)$ /index.php$1;
        try_files $uri $uri/ /index.php?$query_string;
    }
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt  { log_not_found off; access_log off; }

    # Error Pages
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location ~ \.(hh|php)$ {
        fastcgi_keep_conn on;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # Block access to .htaccess
    location ~ \.ht {
        deny all;
    }
}

请求http://api.domain.com/正确提供登录页面,但是请求http://api.domain.com/api/1.0/foo仍然发送到 的 index.php/www/vhosts/api.domain.com/public/index.php而不是 的 index.php /www/vhosts/api.domain.com/api/1.0/public/index.php

有人知道我该如何解决这个问题吗?我要切换的 Apache 配置如下,供参考:

<VirtualHost *:80>
    ServerAdmin [email protected]
    ServerName api.domain.com

    DocumentRoot /www/vhosts/api.domain.com/public/
    <Directory /www/vhosts/api.domain.com/public/>
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    ErrorLog /www/vhosts/api.domain.com/logs/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn

    CustomLog /www/vhosts/api.domain.com/logs/access.log combined
    ServerSignature Off

    Alias /api/1.0 "/www/vhosts/api.domain.com/api/1.0/public/"
    <Directory /www/vhosts/api.domain.com/api/1.0/public/>
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>

    Alias /api/latest "/www/vhosts/api.domain.com/api/1.0/public/"

    SetEnv APPLICATION_ENV testing
</VirtualHost>

顺便提一下,有人能帮hhvm我给这个贴标签吗?我至少需要 300 点声望才能创建标签,而且显然还没有人在这里问过任何与 hhvm 相关的问题。:/

编辑:

根据下面 krisFR 的建议,我尝试对location /api/1.0块进行如下修改:

    location /api/1.0 {
        alias /www/vhosts/api.domain.com/api/1.0/public;
        try_files $uri $uri/ /index.php?$query_string;
    }

但是,这会加载来自的代码,/www/vhosts/api.domain.com/public/index.php而不是我希望它加载的代码/www/vhosts/api.domain.com/api/1.0/public/index.php。还有其他想法吗?

答案1

来源https://stackoverflow.com/questions/20426812/nginx-try-files-alias-directives

这是一个漫长的过程nginx 中存在的 bug。但您可以再次使用 root 指令来解决这个问题。有点像 hack,但至少有效。

同时,我会在位置指令中添加斜线。

location /api/1.0/ {
    root /www/vhosts/api.domain.com/api/1.0/public/;
    try_files $uri $uri/ /index.php?$query_string;
}

答案2

NGinx 还具有别名指示。

试一试 :

location /api/1.0/ {
    alias /www/vhosts/api.domain.com/api/1.0/public/;
    ...
}

编辑 :

你可以尝试这个:

location ^~ /api/1.0/ {
    alias /www/vhosts/api.domain.com/api/1.0/public/;
    ...
}

相关内容