![如何让 Apache 的别名“/foo”/path/to/foo 在 nginx 中工作](https://linux22.com/image/638920/%E5%A6%82%E4%BD%95%E8%AE%A9%20Apache%20%E7%9A%84%E5%88%AB%E5%90%8D%E2%80%9C%2Ffoo%E2%80%9D%2Fpath%2Fto%2Ffoo%20%E5%9C%A8%20nginx%20%E4%B8%AD%E5%B7%A5%E4%BD%9C.png)
我正在尝试在 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/;
...
}