it-swarm-pt.tech

Configurando o WordPress com Permalinks Personalizados e nenhum Arquivo .htaccess?

Eu tenho um cliente que prefere fortemente desabilitar os arquivos .htaccess porque eles gostam de definir as próprias configurações do Apache. No entanto, eles ainda querem URLs amigáveis ​​para SEO.

Existe uma maneira de ter permalinks personalizados sem o arquivo .htaccess? Minha pesquisa até agora parece indicar que isso não é possível, mas talvez um dos desenvolvedores brilhantes saiba como o aparentemente impossível pode ser possível. Desde já, obrigado!

7
Mike Lee

Oi @Mike Lee :

Para responder à sua pergunta, é útil entender como tudo funciona.

Apache veicula URLs que correspondem a arquivos e diretórios

O Apache é projetado para servir arquivos explicitamente correspondidos por URL ou para servir o index.php encontrado em um diretório quando o diretório é explicitamente correspondido.

Mas o Apache pode servir URLs correspondidos por Regex com mod_rewrite

Se você quer que o Apache combine URLs para onde não existem diretórios reais (o caso do WordPress e permalinks), você deve ter alguma maneira de dizer ao Apache como lidar com URLs de maneira diferente. E é exatamente isso que mod_rewrite foi projetado para permitir; Ele fornece aos administradores do servidor a capacidade de definir regras para correspondência de URLs usando expressões regulares. Essas regras encaminham o resultado para outras URLs, geralmente incluindo arquivos .PHP e, às vezes, com parâmetros de URL aprovados. Em última análise, as regras especificam que os arquivos reais são carregados.

E mod_rewrite está configurado com .htaccess ou httpd.conf

Para configurar mod_rewrite, você só pode fazer isso dentro de .htaccess ou dentro do arquivo httpd.conf ou um dos arquivos incluídos, como, por exemplo, httpd-vhosts.conf. Na verdade fico surpreso se seu cliente tem as habilidades para controlar o Apache que eles já não sabem disso.

WordPress sempre usa o mesmo arquivo .htaccess simples

Indo para o que o WordPress faz, quando você define permalinks, o WordPress escreve o seguinte no arquivo .htaccess, assumindo que ele seja gravável (e, neste primeiro exemplo, supondo que o site do seu site é servido pela raiz):

# 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

Advertência: quando o diretório da primeira página do WordPress não é Root

Se o seu site, em vez disso, é servido de /blog, então o arquivo .htaccess escrito seria assim:

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

O WordPress encaminha todos os URLs de correspondência de arquivos/diretórios para index.php

Então, como você pode ver, a única coisa que o WordPress usa .htaccess é mapearanyURL para o domínio /index.php (ou /blog/index.php no segundo exemplo)excetoquando um URL corresponde a um arquivo real (como .jpg/.gif/.png image, uma .css stylesheet, um .js script, etc.) ou quando corresponde a um diretório real (que, até onde eu sei, é não é relevante em uma instalação padrão do WordPress.)

Em PHP WordPress Analisa $_SERVER['REQUEST_URI'] Para Decidir o Que Carregar

Dentro de seu código PHP, o WordPress pega o valor $_SERVER['REQUEST_URI'] que contém a solicitação completa da URL sans o domínio e o esquema (ou seja, scheme é http ou https) e então analisa o valor para determinar qual URL foi solicitada e páginas que ele deve carregar.

Ignorando .htaccess? Obtenha o Apache para carregar URLs virtuais (mas boa sorte com isso!)

Então, se você quiser de alguma forma ignorar .htaccess seu trabalho seria fazer com que o Apache respondesse a um URL arbitrário, em seguida, carregasse o WordPress e configurasse $_SERVER['REQUEST_URI'] para ser o caminho do URL mais os parâmetros; IOW falsificando isso, mas de um jeito bom. Dito isto, eu sei se não conheço maneiras que não sejam excessivamente complicadas para fazer isso.

Incorporando /index.php/ (talvez?!?)

Mesmo que * Chris_O * esteja correto sobre a inclusão de /index.php/ em seus URLs, eu me arrepio sempre que vejo isso. Ele adiciona 10 caracteres a cada URL, tornando-os mais longos e menos significativos para os mecanismos de busca, mas pior ainda, torna-os menos compartilháveis ​​e parece oculto para os usuários. Desculpe Chris eu sei que você quis dizer bem, mas ugh!

Crie diretórios reais para cada URL (talvez?)

Uma maneira de obter permalinks sem tocar no Apache seria escrever um script que gerasse um diretório real para cada URL que você desejasse e, em seguida, armazenasse um index.php lá que carregasse o WordPress. É claro que seria um enorme esforço para um pequeno benefício e exigiria que o servidor tivesse acesso de gravação, o que deve ser pior do que usar um arquivo .htaccess.

Eu odeio admitir, mas isso é o que eu fiz por volta de 1998 com um site .ASP- quando IIS não suportava reescrita de URL (e até hoje ainda é um PITA real!) Foi um hack feio, foi uma dor para manter e eu odiava, mas os URLs eram ótimos para usuários e para SEO!

Melhor solução? Adicionar regras de reconfiguração a httpd.conf

De volta ao que provavelmente é a melhor solução, e @Simon Brown realmente recomendou; adicione suas regras de reescrita a httpd.conf ou um dos arquivos include como httpd-vhosts.conf (que é como o Apache é configurado no localhost no meu Mac). Adicione a seguinte diretiva certificando-se de alterar o diretório para corresponder ao diretório do seu site:

<Directory "/home/example_user/public_html/">
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>

Bônus! Com o bloqueio, também o desempenho

Esta última opção deve eliminar qualquer .htaccess e colocar o controle de volta em suas mãos. Melhor ainda, é um pouco mais de desempenho, já que httpd.conf é carregado apenas uma vez quando o Apache é iniciado, mas.htaccess arquivos são carregados e analisados ​​em cada solicitação de URL!

P.S. Mais uma coisa a considerar seria o front-end Apache com um servidor de cache como Nginxque eu acredito que está se tornando uma melhor prática para sites WordPress de alto tráfego que realmente precisa ser performant. Isso pode exigir ajustes no campo verde, porque eu não acho que a maioria das pessoas tem usado o Nginx para fazer a URL reescrevendo o Apache, mas se essa direção lhe interessar aqui, há alguns links a seguir:

15
MikeSchinkel

Permalinks sem mod_rewrite

Sem um arquivo .htaccess ou modificando o seu arquivo httpd.conf, o melhor que você pode fazer é performar os pathinfo. Os permalinks do Pathinfo são os mesmos permalinks, exceto que eles começam com index.php.

Para usar os permalinks pathinfo, coloque index.php/no início da sua estrutura personalizada de permalink:

/index.php/%postname%/

Veja o artigo do Codex para mais informações.

2
Chris_O

De volta aos Dias Antigos, o WordPress precisava escrever um novo arquivo de configuração toda vez que você alterava a estrutura do permalink. Em configurações modernas, as RewriteRules são imutáveis:

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

Todos os pedidos de arquivos inexistentes (isto é, um caminho permalink customizado que não corresponde a um arquivo no sistema de arquivos) são passados ​​através de index.php, e $_SERVER['REQUEST_URI'] informa PHP o que foi realmente requisitado. Seu cliente pode definir as regras de reescrita em httpd.conf ou .htaccess, e você não precisará modificá-las ao ajustar a estrutura de permalink.

Alguns plugins tentam modificar o .htaccess, ou pedem que você modifique o arquivo. Esta solução pode não ser para todos, mas vale a pena considerar.

0
Annika Backstrom