NGINX使用Laravel和HHVM重写

时间:2014-05-26 14:31:13

标签: nginx laravel rewrite fastcgi hhvm

nginx的新手并且遇到了一些重写问题。

我有一个链接到子域test.mydomain.com的网站。 我目前的nginx配置:

server {
    listen 80 default_server;

    root /test/public;
    index index.html index.htm index.php;

    server_name localhost;

    access_log /var/log/nginx/localhost.laravel-access.log;
    error_log  /var/log/nginx/locahost.laravel-error.log error;

    charset utf-8;

    location /admin/ {
        alias /test/public/admin/public/;
        try_files $uri $uri/ /admin/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_page 404 /index.php;      

    include hhvm.conf;  # The HHVM Magic Here

    # Deny .htaccess file access
    location ~ /\.ht {
        deny all;
    }
}

以下是(默认)hhvm.conf

的内容
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;
}

我访问test.mydomain.com,一切正常。 然而!我在test.mydomain.com/admin上也有一个管理面板。所有要求 应将test.mydomain.com/admin/*重写为/test/public/admin/public/*, 而是使用我当前的配置,它们都被重写为public / index。

我的文件夹结构看起来有点像这样:

/test
    /admin
        project.stuff
        /public
            index.php
            etc.php
    /public
        index.php
        etc.php

MAJOR EDIT

我在hhvm.conf中添加了以下条件:

if ($request_uri ~* /admin) {
    root /test/admin/public;
}

/ admin请求现在会相应地重写。 nginx文档声明如果两个位置模式匹配,则只使用最简单的一个(排序)。现在剩下的就是不仅可以使用.hh和.php文件,还可以使用资产文件(js,css,jpg等)。

我认为类似的东西就足够了但遗憾的是它没有:

location ~ \.(js|css)$ {
    if ($request_uri ~* /admin) {
        root /test/admin/public;
    }
}

1 个答案:

答案 0 :(得分:3)

本部分适用于问题的初始版本

root指令可以在location {}中使用,因此在您的情况下,配置可能如下所示:

server {
    listen 80 default_server;
    server_name localhost;
    index index.html index.htm index.php;
    try_files $uri $uri/ =404;
    ...

    location / {
        root /test/public;
        ...
    }

    location /admin/ {
        root /test;
        ...
    }
}

http://nginx.org/en/docs/http/ngx_http_core_module.html#root

次要更新:

我已将try_files $uri $uri/ index.php?$query_string;替换为try_files $uri $uri/ =404,因为对我来说似乎更合乎逻辑,因为index index.html index.htm index.php就在这里。


本部分适用于问题的第二个主要版本

这是基于您目前提供的信息的正确配置版本:

server {
    listen 80 default_server;
    server_name localhost;

    root /test/public;
    index index.html index.htm index.php;
    ...

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        ...
    }

    location /admin/ {
        alias /test/public/admin/public/;
        try_files $uri $uri/ /admin/index.php?$query_string;
        ...
    }
}

但是,根据您的声明,在您将root移动到location后,您的常规网站停止工作,可以断定您没有提供所有必需的信息,并且还有其他错误在您的配置中,这就是为什么我要求您在完整 nginx配置中附加您的问题,这将使我们双方的生活更加轻松......


本部分适用于问题的第三个主要版本

这最终适合你:

server {
    listen 80 default_server;

    root /test/public;
    index index.html index.htm index.php;

    server_name localhost;

    access_log /var/log/nginx/localhost.laravel-access.log;
    error_log  /var/log/nginx/locahost.laravel-error.log error;

    charset utf-8;

    location /admin/ {
        alias /test/admin/public/;
        try_files $uri $uri/ /admin/index.php?$query_string;
        include hhvm.conf;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
        include hhvm.conf;
    }

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

    error_page 404 /index.php;

    # Deny .htaccess file access
    location ~ /\.ht {
        deny all;
    }
}

<强>更新

您可能还需要在hhvm.conf文件和fastcgi_params文件中替换此行:

fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

以下内容:

fastcgi_param  SCRIPT_FILENAME $request_filename;