Alterar permalinks me dá 404 erros no nginx


18

EDITAR

Acontece que eu estava latindo na árvore errada tentando editar o .htaccess, pois o nginx não o usa. Aparentemente, o que eu preciso fazer é editar meu arquivo .conf. Antes de ler isso, o my_app.conf era assim:

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;
    }
}

Agora, fica assim, e ainda não está funcionando:

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;
    }
}

Alguém sabe o que estou fazendo de errado?

EDIT FIM

Alterei meus permalinks do padrão para /% postname% /, e agora os links no painel de administração do WordPress me dão erros 404 - não páginas do WordPress 404, páginas do nginx 404. Pesquisando por que isso me foi dito que isso deveria estar editando meu arquivo .htaccess ou me dizendo que o WordPress não pode reescrever .htaccess - o arquivo .htaccess é inexistente e o WordPress não está dando nenhum erro quando altero os links permanentes.

Tentei criar um arquivo .htaccess em branco na minha pasta do wordpress, concedendo-lhe 666 permissões, alterando o usuário e o grupo para www-data e, em seguida, alterando os links permanentes - que não funcionaram. Eu mudei para isso antes de alterar os links permanentes:

# 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

Quando isso não funcionou, mudei RewriteBasepara /wordpress/antes de alterar os links permanentes novamente - ainda nada.

Também fui ao arquivo .conf do meu site e mudei try_files $uri $uri/ /index.php;para o seguinte, reiniciando o nginx e o php5-fpm a cada vez;

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

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

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

Estou executando um servidor doméstico com nginx. Alguma idéia sobre o que está acontecendo aqui?

Respostas:


13

Essas são .htaccessregras de reescrita do Apache , mas você declarou que está em um servidor Nginx. O Nginx não usa um .htaccessarquivo no nível de diretório, muito menos o .htaccessarquivo em si. Você precisa editar a própria configuração do servidor. O Codex tem uma amostra detalhada :

# 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;
}

Obrigado, eu votaria nisso se tivesse reputação. Estou com um pouco de dificuldade para implementar isso no meu arquivo .conf, pois ele já foi alterado significativamente do padrão, mas pelo menos não estou mais brincando com o .htaccess.
Ninjachicken1

@s_ha_dum, usei essa configuração até ontem quando atualizei para o wordpress 4.8 e agora estou recebendo 404s na estrutura personalizada permalinks .... tentei depurá-la desde ontem, mas nada worx, alguma idéia?
Jadeye #

Eu tive que mudar a última linha para ler "fastcgi_pass unix: /var/run/php/php7.2-fpm.sock;" ao trabalho no Ubuntu 18.04, mas ele funciona e salvou minha sanidade
Rob

18

Estou usando o wordpress multisite com a configuração personalizada de link permanente: /% category% /% postname% /

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

No servidor {

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

Se o seu wordpress raiz não for o webroot, mas http://domain.com/wordpress/ :

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

Se você estiver usando o wordpress antigo com blogs.dir, adicione: location ^ ~ /blogs.dir {internal; alias /var/www/wordpress/wp-content/blogs.dir; access_log off; log_not_found off; expira no máximo; }

Verifique a configuração do nginx: sudo nginx -t

Recarregar nginx: serviço sudo recarregar nginx

Tente também alterar as configurações do link permanente.


4
Esta é a melhor resposta para quem deseja mover manualmente uma instalação do WordPress para um subdiretório com um novo nome de domínio! MUITO OBRIGADO! Essa deve ser a resposta aceita.
precisa saber é o seguinte

1
O caminho: / etc / nginx / site-available / deve ler: / etc / nginx / sites-available /
Concede

6

Tinha que adicionar esse trecho de código ao /sites-available/your-settings-filee /sites-enabled/your-settings-file:

server {
[...]

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

[...]
}

Está funcionando para mim agora.


1
Esta é a resposta simples que eu estava procurando, graças
ThEBiShOp

1
Isso funcionou! Poderia explicar o que faz? (esp a parte "último" ...)
Sidd

1

Eu tive que definir o caminho raiz para o diretório instalado do wordpress: root / var / www / html / wp;

Não gosto porque tenho mais aplicativos instalados nesta máquina, mas criar mais hosts virtuais deve ser suficiente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.