使用nginx作为apache的反向代理并希望获得更多的htaccess控件

时间:2013-12-09 16:40:47

标签: nginx

我在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;
  }
}

似乎我可能需要采用相反的方法并代理所有内容,但从代理中排除某些文件类型。

感谢大家的建议!

1 个答案:

答案 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)$