多个站点带有nginx的固定链接

时间:2012-02-14 作者:seaneshbaugh

我正在尝试设置一个新的本地开发服务器,而不是Apache,我决定使用nginx。

我想做的是让每个WordPress站点位于其自己的目录中/usr/share/nginx/www. 这些网站只能在我们的本地网络上使用。例如:

/usr/share/nginx/www/ourcompanywebsite -> http://192.168.2.250/ourcompanywebsite

/usr/share/nginx/www/firstclientwebsite -> http://192.168.2.250/firstclientwebsite

/usr/share/nginx/www/secondclientwebsite -> http://192.168.2.250/secondclientwebsite

/usr/share/nginx/www/sitefortestingthings -> http://192.168.2.250/sitefortestingthings

获取该设置相当简单。事实上,我的工作很好。问题是,漂亮的永久链接不起作用。不幸的是,我对nginx了解不够,无法实现这一点。

这是我当前启用/默认的nginx站点。conf文件。请原谅任何明显的业余错误;我真的不能强调我对设置nginx知之甚少。

server {
    listen 80;
    listen [::]:80 default ipv6only=on;

    root /usr/share/nginx/www;
    index index.php index.html index.htm;

    location / {
        auth_basic "You shall not pass!";
        auth_basic_user_file /home/mojo/src/config/nginx/htpasswd;
        try_files $uri $uri/ /index.html;
    }

    location /doc {
        root /usr/share;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    location /images {
        root /usr/share;
        autoindex off;
    }

    error_page 500 502 503 504 /50x.html;

    location = /50x.html {
        root /usr/share/nginx/www;
    }

    location ~ \\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~ /\\.ht {
        deny all;
    }
}
我看过关于如何使用nginx设置永久链接的指南,但它们似乎都假设您只有一个站点,或者您的单独站点位于不同的域上。

那么,我想要的设置是否可行?如果是这样的话,我需要做什么来实现它?如果不是,或者如果这是一个非常糟糕的主意,那么什么是一个类似的设置,让我有多个WordPress安装和相当长的链接?如果您有任何其他有用的建议可以改进我的配置,我们将不胜感激。

最坏的情况下,我可以回到Apache(在那里我有我想要的设置工作),但我宁愿解决这个问题。

3 个回复
SO网友:Chris_O

要使多个站点工作,您需要为每个站点提供一个单独的服务器条目。可以用Apache vhosts的工作方式来考虑它。

您需要为每个域指定文档根目录和服务器名称,或使用$主机别名。在本地计算机上创建主机文件条目以与每个域名对应也是一个好主意,因此:http://192.168.2.250/ourcompanywebsite 将成为:http://ourcompanywebsite

通过包含从nginx加载的示例服务器文件。形态

server {
    listen 80;
    server_name ourcompanywebsite firstclientwebsite secondclientwebsite;       
    root /usr/share/nginx/www/$host;
    error_log /var/log/nginx/error.log;

    include global.restrictions.conf;
    include global-wp.conf;
}
全球wp。形态
   #The section below contains your WordPress rewrite rules.
   location / {
          try_files $uri $uri/ /index.php?q=$uri&$args;
    }

  fastcgi_intercept_errors off;
  location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ {
    expires max;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
 }

location ~ \\.php {
    try_files $uri =404; #This line closes a big security hole
                         #see: http://forum.nginx.org/read.php?2,88845,page=3
    fastcgi_index index.php;
    include fastcgi_params;

    fastcgi_pass 127.0.0.1:9000;
}    

全球。限制。形态

# Global restrictions configuration file.
# Designed to be included in any server {} block.</p>
location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

# Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\\. {
    deny all;
    access_log off;
    log_not_found off;
}
有关使用WordPress设置的完整Nginx的更多详细信息,请参阅我的教程:WordPress Performance Server – Debian “squeeze” with Nginx, APC and PHP from the Dotdeb repos

*注意:使用php-fpm的Nginx在性能方面比使用Apache作为后端代理要好得多,除非您有大量301和302重定向列表。

SO网友:Pothi Kalimuthu

在你的“位置/”街区

try_files $uri $uri/ /index.html;
try\\u files指令不会将特定于WP的文件传递给PHP-FPM。因此,要使permalink工作,“location/”应该具有以下任一代码。。。

try_files $uri $uri/ /index.php;

try_files $uri $uri/ /index.php?$args;
顺便说一句,Nginx可以很好地将Apache作为后端。要让Apache作为后端工作,请更改Apache侦听的端口(和/或IP)(127.0.0.1中的示例81),然后使用以下代码将所有动态内容传递给Apache(包括permalinks)。

location ~* \\.(css|js|jpg|png|gif|xml|ico) {
   root /path/to/standard/wordpress/installation;
   expires 31d;
}

location / {
   proxy_pass http://127.0.0.1:81;
}
有关更多详细信息,请查看Nginx on WordPress CodexWordPress on Nginx wiki.

SO网友:Pradeep

试试看,我遇到了类似的问题:

set $dir "";

if ($request_uri ~ ^/([^/]*)/.*$ ) {
    set $dir1 /$1;
}

location / {
    try_files $uri $uri/  $dir1/index.php?$args;
}
说明:

由于每个WordPress安装都在一个目录中,因此我们将目录名匹配为pass it to try\\u files。如果您手动为每个安装编写了代码,它将如下所示:

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

结束

相关推荐

Multiple permalinks

我的博客使用/?p=378 多年的permalink构造。这对Google Analytics没有多大帮助,我想把它改为YEAR/MONTH/DAY/post-title 结构有没有一种方法可以做到这一点而不丢失向后兼容性,以便旧的链接可以工作?