web-dev-qa-db-ja.com

サブフォルダーのNginxの書き換え(404)

私は[〜#〜] nginx [〜#〜]サーバー上にサイトホストを持っていますが、これはindex.phpを使用してnginxサイト構成でtry_filesを削除するために正常に機能していました。

しかし、ここにブログを追加します。URLはwww.foo.com/blogになります。ブログにアクセスしてindex.php?p=を使用できます。

しかし、Nginxヘルパーwww.foo.com/blog/2013/07/barprettyパーマリンクを使用すると、404が得られます。

server {
  # don't forget to tell on which port this server listens
  listen 80;

  # listen on the www Host
  server_name foo.com;

  # and redirect to the non-www Host (declared below)
  return 301 $scheme://www.ultra-case.com$request_uri;
}

server {
  # listen 80 default_server deferred; # for Linux
  # listen 80 default_server accept_filter=httpready; # for FreeBSD
  listen 80;

  # The Host name to respond to
  server_name www.foo.com;

  # Path for static files
  root /web/foo.com

  #index file
  index index.php;

  #Specify a charset
  charset utf-8;

  # Custom 404 page
  error_page 404 /404.html;

  # Uri Rewrite

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

  location / {
    autoindex on;
    # This is cool because no php is touched for static content.
    # include tihe "?$args" part so non-default permalinks doesn't break when using query string
    try_files $uri $uri/ /index.php?$args;
  }
  location ~ \.php$ {
    #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    include fastcgi.conf;
    fastcgi_intercept_errors on;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
  }

  # Include the component config parts for h5bp
  include conf/h5bp.conf;
}
17
Cauliturtle

受け入れられた答えは、index.php
これにより、特定のスクリプトインクルードが壊れますwp-adminスクリプトがその1つです。

以下を使用できます。

location /blog/ {
    index index.php;
    try_files $uri $uri/ /blog/index.php?$args;
}
37
ereckers

ええと...コメントと回答ありがとうございます。しかし、最後にこの方法を使用して機能させます

location /blog {
    index index.php;
    rewrite ^/blog/(.*)+$ /blog/index.php?$1; # it finally works
    # return 200 $request_uri; # it is for inspect what $request_uri is
    # try_files $uri $uri/ /blog/index.php$request_uri$is_args$args; # it gets 500 server error
}

現在の設定に問題がないかどうかを指摘してください。ありがとうございました!

15
Cauliturtle

サブフォルダー/ブログの下のパーマリンクをキャッチするには、次のことをお勧めします

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

これを試してください、私はあなたの書き換えで使用している同じ動作を模倣するように私の答えを変更しました。

location ~ /blog(.*) {
    index index.php;
    try_files $uri /blog/index.php?$1&$args;
}
1

パーマリンクを有効にすると、ここに示す両方の回答の組み合わせを必要とすることがわかりました。それ以外の場合

  1. 書き換えだけで、静的ファイルはどれも提供されませんでした
  2. Tryファイルのみでは、パーマリンクは機能しませんでした

これは私のセットアップに取り組んでいます

location /blog/ {
      rewrite ^/blog/(blog/(tag|category|20??)/.*)+$ /blog/index.php?$1;
      try_files $uri $uri/ /blog/index.php?$args =404;
}
0
paulusm

ルートと1つのサブフォルダーレベルでのきれいなURLのユニバーサルソリューション:

set $virtualdir "";
set $realdir "";

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

if (-d "$document_root$virtualdir") {
        set $realdir "${virtualdir}";
}

location / {
        try_files $uri $uri/ $realdir/index.php?$args;
}
0
amq

これを試して

location /api {
    # example: http://demo.com/api/channels/dmzb
    root   /data/webserver/demo.com/api/web;
    rewrite ^/api/(.*) /$1 break;
    try_files $uri $uri/ /api/index.php?$args;

    location ~ ^/api/index\.php {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;

        # fix request_uri
        set $changed_request_uri $request_uri;
        if ($changed_request_uri ~ ^/api(.*)) {
            set $changed_request_uri $1;
        }
        fastcgi_param REQUEST_URI $changed_request_uri;

        # fix script_filename
        fastcgi_split_path_info ^(?:\/api\/)(.+\.php)(.*);
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}
0
jk2K

Phpについて考えてみてください。次のようなものでは、書き換えは必要ありません。

location /app/ {
  include fastcgi_params;
  fastcgi_param  SCRIPT_FILENAME /path/to/your/app/index.php;
  fastcgi_pass php;
}

次のfastcgiパスで

upstream php {
    server unix:/var/run/php5-fpm.sock;
}
0
Jesús Germade