在子目录nginx中的lemonstand

时间:2013-03-21 09:15:22

标签: nginx

我在子目录www.mysite.com/shop/

下运行Lemonstand

这是我对lemonstand的位置规则:

# Lemonstand
location /shop {
    root /home/sites/mysite.com/public_html/shop/;
    index index.php;

    include fastcgi_params;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    fastcgi_param SCRIPT_FILENAME $document_root/index.php;
    fastcgi_param SCRIPT_NAME index.php;
    fastcgi_param QUERY_STRING url=$uri&$args;

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_buffer_size 32k;
    fastcgi_buffers 4 32k;
    fastcgi_busy_buffers_size 64k;
}

我可以访问mysite.com/shop上的页面。

商店的所有网址

mysite.com/shop/category/freight
mysite.com/shop/products/dog-toy

实际上在页面上,它们的结构如下:

mysite.com/category/freight
mysite.com/products/dog-toy

奇怪的是,即使我在浏览器中粘贴了正确的URL,也只会显示我的基础/商店/页面,就好像其他页面不存在一样。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您需要从不同的位置块提供php。

[编辑]为避免与其他php脚本冲突,您可以使用命名位置。

location ^~/shop/ {
    root /home/sites/mysite/public_html;

    try_files $uri $uri/ @anotherPhpSite
}

location @anotherPhpSite {
    include fastcgi_params;

    # Defend against arbitrary PHP code execution
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    # More info:
    # https://nealpoole.com/blog/2011/04/setting-up-php-fastcgi-and-nginx-dont-trust-the-tutorials-check-your-configuration/
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

    fastcgi_param SCRIPT_FILENAME $document_root/shop/index.php;
    fastcgi_param SCRIPT_NAME /shop/index.php;
    fastcgi_param QUERY_STRING url=$uri&$args;

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_buffer_size 32k;
    fastcgi_buffers 4 32k;
    fastcgi_busy_buffers_size 64k;

}

答案 1 :(得分:0)

我的主要问题是表达式语法和配置结构。

行。所以这是工作配置文件。最佳实践是拆分这两个位置,并为它们使用一个php块。

首先使用silverstripe CMS的主控制器块,这里我将数据直接传递给蓝宝石中的主控制器。

# Main silverstripe declaration
location / {
    index /sapphire/main.php;
    try_files $uri $uri/ /sapphire/main.php?url=$uri&$args;
}

第二个是我的商店在一个运行lemonstand的子目录下。主要是获取表达式正确,然后将请求传递到相关路径的情况。我没有在这里设置另一个根或别名,因为规则是从重写继承的。

# Shop lemonstand files
location /shop/ {
    index index.php;
    rewrite ^/shop(.*)$ /shop/index.php?q=$1 last;
    try_files $uri $uri/ /shop/index.php?q=$1;
}

最后我使用了一个通用的PHP块,所以我不需要在前两个中复制我的代码。所以经过前两个区块的任何东西都会传到这里。

# PHP controller
location ~ ^(.*?\.php)(/.*)?$ {
    fastcgi_split_path_info ^(.+?\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_index index.php;
    fastcgi_buffer_size 32k;
    fastcgi_buffers 4 32k;
    fastcgi_busy_buffers_size 64k;
}