我在apache2的反向代理配置中使用nginx。我已经以这种方式使用了其他预配置的Web服务器,并且可以完全控制.htaccess文件中的重定向。
我目前的配置不允许这样做。首先,我将解释会发生什么。
假设我想将/ google重定向到http://google.com。我将以下行添加到我的.htaccess文件中。
redirect 307 /google http://google.com
我知道它正在运行,因为我可以使用服务器中的curl进行测试。这是在代理后面直接点击apache。
curl -I localhost:8080/google
我得到的是307,正如我所料。
但是如果这个请求从外部命中nginx,nginx知道web根目录中没有这样的文件并且响应404.
我可以修改配置吗?
这是我的这个vhost的nginx配置文件。
server {
listen 80;
root /var/www/mywebsite.com/html;
index index.php index.html index.htm;
server_name mywebsite.com;
access_log /var/log/nginx/mywebsite.com.access.log;
error_log /var/log/nginx/mywebsite.com.error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
location ~ /\. {
deny all;
}
}
似乎我可能需要采用相反的方法并代理所有内容,但从代理中排除某些文件类型。
感谢大家的建议!
答案 0 :(得分:2)
如果您要将该请求转发至/google
至 apache ,则只需更改location ~ \.php$
模式以包含您想要的请求:
location ~ (/google/?)|(\.php)$ {
另一方面,如果您希望 nginx 处理重定向,您可以添加新规则:
location ~ /google {
return 307 http://google.com;
}
只需确保将放在包含location
的{{1}}块之前。
编辑: 要转发所有未命中文件的请求,请使用以下命令:
try_files
另外,如果你想让nginx也为整个目录服务,那么添加另一个条件:
location /
{
if (!-f $request_filename) #test if a static file does not exists
{
# forward the request if there is no file to serve:
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
}
另请注意,如果您只想要提供特定文件,则!-d $request_filename
使用该模式匹配这些文件。例如,如果您只想提供location /
和jpg
,请使用
css
EDIT2:这里有一个简化版本的脚本,它也更强大 - 让你只提供你想要的文件类型:
location ~ \.(jpg|css)$