如何在nginx的论坛子文件夹中提供静态文件


How to serve static files in forum subfolder on nginx?

我正在尝试建立一个nginx服务器,基本上有三种不同类型的内容:

  • 主网站,运行在CodeIgniter上
  • 一个问答;论坛,位于子文件夹/qa中(运行在Question2Answer上)
  • 静态文件(位于不同位置,包括/qa

我遇到了各种各样的麻烦。我当前的配置(在服务器块内)是:

# Q2A
if ($request_uri ~* "^/qa/") {
    rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
}
# CI
if (!-e $request_filename) {
    rewrite ^(.+)$ /index.php?$1 last;
}
location / {
    index index.php index.html;
}
location ~ '.php$ {
        try_files $uri =404;
        fastcgi_cache one;
        fastcgi_cache_key $scheme$host$request_uri;
        fastcgi_cache_valid  200 302 304 5m;
        fastcgi_cache_valid  301 1h;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/www/site$fastcgi_script_name;
        fastcgi_param HTTPS off;
}

除了以下问题外,这基本上是有效的:

  • 对我的应用程序文件夹中的PHP文件的请求正在被解析/执行。显然,由于这不会通过CI应用程序,因此会导致错误(找不到变量等)
  • qa文件夹中的所有静态文件都将传递到Q2A应用程序,而不是用作静态文件

我尝试了很多不同的东西,但都记不清了,比如使用location ~* ^/qa/ {}这样的位置块和try_files的各种排列,但没有成功。我还尝试在nginx网站上修改这个Wordpress示例。他们中的大多数人只是以/qa/返回404结束。某些方法导致服务器提供原始PHP代码!

有人能帮我找到合适的方法吗?

更换

if ($request_uri ~* "^/qa/") {
    rewrite ^/qa/(.*)$ /qa/index.php?qa-rewrite=$1 last;
}

带有

location ~ /qa/(.*)? {
    try_files $uri /qa/index.php?qa-rewrite=$1&$query_string;
}

还有块

if (!-e $request_filename) {
    rewrite ^(.+)$ /index.php?$1 last;
}

最好在/位置内移动并转换为try_files

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

如果您仍然有问题,请告诉我。

如果是邪恶的。但是您可以使用try_files和一些位置块来完成同样的事情。

# in a `server` block
index index.php index.html;
# case sensitive version
# location ~ ^/qa/(.*)?$ {
location  ~* ^/qa/(.*)?$ {
    try_files $uri /qa/index.php?qa-rewrite=$1;
}
location / {
    try_files $uri /index.php?$request_uri;
}
# not sure if you even need location /, this might work
# try_files $uri /index.php?$request_uri;
# the rest of your FastCGI config stuff here

这是基于我自己运行nginx的PHP站点的配置。

请注意,这是未经测试的,但它应该可以工作,因为它只是一个稍微修改过的版本。

只需在日志和根指令中将(insert)替换为服务器值即可。

server {
    listen 80;
    access_log  /var/log/nginx/(insert).access.log;
    error_log  /var/log/nginx/(insert).error.log;
    root (insert);
    server_name (insert);
    rewrite ^/qa/(.*(?!['.js|'.css])[^.]+)$ /qa/index.php/$1 last;
    rewrite ^(.*(?!['.js|'.css])[^.]+)$ /index.php/$1 last;
    location ~ [^/]'.php(/|$) {
        fastcgi_cache one;
        fastcgi_cache_key $scheme$host$request_uri;
        fastcgi_cache_valid  200 302 304 5m;
        fastcgi_cache_valid  301 1h;
        fastcgi_split_path_info ^(.+?'.php)(/.*)$;
        fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}