영구 링크를 변경하면 nginx에서 404 오류가 발생합니다.


18

편집하다

nginx가 사용하지 않기 때문에 .htaccess를 편집하려고하는 잘못된 트리를 짖는 것으로 나타났습니다. 분명히해야 할 일은 내 .conf 파일을 편집하는 것입니다. 이 내용을 읽기 전에 my_app.conf는 다음과 같습니다.

upstream backend {
    server unix:/u/apps/my_app/tmp/php.sock;
}

server {

    listen 80 default;
    root /u/apps/my_app/www;
    index index.php;

    access_log /u/apps/my_app/logs/access.log;
    error_log /u/apps/my_app/logs/error.log;

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

    # This location block matches anything ending in .php and sends it to
    # our PHP-FPM socket, defined in the upstream block above.
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
        include fastcgi_params;
    }

    # This location block is used to view PHP-FPM stats
    location ~ ^/(php_status|php_ping)$ {
        fastcgi_pass backend;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
        allow 127.0.0.1;
        deny all;
    }

    # This location block is used to view nginx stats
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

이제 다음과 같이 보이고 여전히 작동하지 않습니다.

upstream backend {
    server unix:/u/apps/my_app/tmp/php.sock;
}

server {

    listen 80 default;
    root /u/apps/my_app/www;
    index index.php;

    access_log /u/apps/my_app/logs/access.log;
    error_log /u/apps/my_app/logs/error.log;

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

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

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2    |doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
    }

    # Uncomment one of the lines below for the appropriate caching plugin (if used).
    #include global/wordpress-wp-super-cache.conf;
    #include global/wordpress-w3-total-cache.conf;

    # This location block matches anything ending in .php and sends it to
    # our PHP-FPM socket, defined in the upstream block above.
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /u/apps/my_app/www$fastcgi_script_name;
        include fastcgi_params;
    }

    # This location block is used to view PHP-FPM stats
    location ~ ^/(php_status|php_ping)$ {
        fastcgi_pass backend;
        fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
        include fastcgi_params;
        allow 127.0.0.1;
        deny all;
    }

    # This location block is used to view nginx stats
    location /nginx_status {
        stub_status on;
        access_log off;
        allow 127.0.0.1;
        deny all;
    }
}

내가 뭘 잘못하고 있는지 아는 사람 있나요?

편집 종료

내 영구 링크를 기본값에서 / % postname % /로 변경했으며 이제 WordPress의 관리자 패널 내의 링크에서 404 오류-WordPress 404 페이지가 아닌 nginx 404 페이지가 표시됩니다. 이것이 왜 내 .htaccess 파일을 편집 중이거나 WordPress가 .htaccess를 다시 쓸 수 없다고 알려주는 이유를 찾고 있습니다. .htaccess 파일이 존재하지 않으며 영구 링크를 변경할 때 WordPress에서 오류가 발생하지 않습니다.

워드 프레스 폴더에 빈 .htaccess 파일을 만들어 666 권한을 부여하고 사용자 및 그룹을 www-data로 변경 한 다음 작동하지 않는 영구 링크를 변경하려고했습니다. 그런 다음 영구 링크를 변경하기 전에 다음과 같이 변경했습니다.

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

그것이 작동하지 않을 때, 다시 permalinks를 변경 RewriteBase하기 /wordpress/전에로 바뀌 었습니다 . 아직 아무것도 없습니다.

또한 내 사이트의 .conf 파일로 try_files $uri $uri/ /index.php;이동하여 다음으로 변경 하여 매번 nginx와 php5-fpm을 다시 시작했습니다.

try_files $uri $uri/ /index.php?$query_string;

try_files $uri $uri/ /index.php?q=$request_uri;

try_files $uri $uri/ /index.php?$args;

nginx로 홈 서버를 실행하고 있습니다. 여기서 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?

답변:


13

.htaccess규칙 은 Apache 다시 쓰기 규칙이지만 Nginx 서버에 있다고 명시했습니다. Nginx는 .htaccess비슷한 디렉토리 레벨 파일을 사용하지 않고 .htaccess파일 자체를 사용하는 경우가 훨씬 적습니다 . 서버 구성 자체를 편집해야합니다. 코덱스에는 세부 샘플이 있습니다 .

# WordPress single blog rules.
# Designed to be included in any server {} block.

# This order might seem weird - this is attempted to match last if rules below fail.
# http://wiki.nginx.org/HttpCoreModule
location / {
    try_files $uri $uri/ /index.php?$args;
}

# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;

# Directives to send expires headers and turn off 404 error logging.
location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
       access_log off; log_not_found off; expires max;
}

# Uncomment one of the lines below for the appropriate caching plugin (if used).
#include global/wordpress-wp-super-cache.conf;
#include global/wordpress-w3-total-cache.conf;

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    # This is a robust solution for path info security issue and works with "cgi.fix_pathinfo = 1" in /etc/php.ini (default)

    include fastcgi.conf;
    fastcgi_index index.php;
#   fastcgi_intercept_errors on;
    fastcgi_pass php;
}

고마워요, 평판이 좋으면 이걸 투표하겠습니다. .conf 파일에 이것을 구현하는 데 약간의 어려움이 있습니다. 이미 기본값에서 크게 변경되었지만 적어도 .htaccess로 더 이상 다루지 않습니다.
ninjachicken1

@ s_ha_dum, 나는 wordpress 4.8로 업데이트 할 때 어제까지 thies 구성을 사용했으며 이제 permalinks 사용자 정의 구조에서 404를 얻었습니다.
Jadeye

"fastcgi_pass unix : /var/run/php/php7.2-fpm.sock;"라는 마지막 줄을 바꿔야했습니다. 우분투 18.04에서 작업하지만 작동하고 내 정신을 구했다
Rob

18

사용자 정의 permalink 설정으로 wordpress multisite를 사용하고 있습니다 : / % category % / % postname % /

/etc/nginx/site-available/domain.conf

서버에서 {

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

루트 워드 프레스가 루트가 아닌 http://domain.com/wordpress/ 인 경우 :

location /wordpress/ {
    try_files $uri $uri/ /wordpress/index.php?q=$uri$args;
}

blogs.dir과 함께 이전 wordpress를 사용하는 경우 다음을 추가하십시오. location ^ ~ /blogs.dir {internal; 별명 /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; 최대 만료 }

nginx 구성을 확인하십시오. sudo nginx -t

nginx를 다시로드 : sudo 서비스 nginx를 다시로드

또한 퍼머 링크 설정을 변경하십시오.


4
이것은 WordPress 설치를 새 도메인 이름 아래의 하위 디렉토리로 수동으로 옮기려는 사람에게 가장 적합한 답변입니다! 정말 고맙습니다! 이것이 정답입니다.
specialk1st

1
경로 : / etc / nginx / site-available /은 다음과 같아야합니다. / etc / nginx / sites-available /
Grant

6

모두에이 코드 조각을 추가했다 /sites-available/your-settings-file/sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

지금 나를 위해 일하고 있습니다.


1
이것은 내가 찾던 간단한 답변입니다.
ThEBiShOp

1
이것은 효과가 있었다! 그것이 무엇을하는지 설명해 주시겠습니까? ( "마지막"부분을
뛰어 넘다

1

나는 워드 프레스가 설치된 디렉토리로 루트 경로를 설정해야했다 : root / var / www / html / wp;

이 컴퓨터에 더 많은 응용 프로그램이 설치되어 있기 때문에 마음에 들지 않지만 더 많은 가상 호스트를 만드는 것으로 충분합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.