Soltar barra no apache para o diretório

1

Eu tenho o seguinte url www.example.com/advice/ agora observe a barra final no final do URL? Eu gostaria que isso fosse removido para algo como www.example.com/advice . Agora, quando eu digito esse URL no navegador, sou redirecionado para a barra final, mesmo com o curl, por exemplo. Agora eu sei que a barra final está sendo adicionada porque o conselho é um diretório real.

[steve@dev dev.www.example.com]$ curl -I  https://dev.www.example.com/advice -k
  HTTP/1.1 301 Moved Permanently
  Date: Fri, 25 Nov 2016 08:20:11 GMT
  Server: Apache/2.4.6 (CentOS)
  Location: https://dev.www.example.com/advice/
  Cache-Control: max-age=0
  Expires: Fri, 25 Nov 2016 08:20:11 GMT
  Connection: close
  Content-Type: text/html; charset=iso-8859-1
[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice/ -k
HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 08:21:19 GMT
Server: Apache/2.4.6 (CentOS)
X-Powered-By: PHP/5.6.27
Set-Cookie: flarum_session=mfbou2hcbvcobhncnaqlvl9bm7; Path=/; HttpOnly
X-CSRF-Token: WV69M1oi8POqOcXi6MvwKhbJQ72Tmo2WpFn3oxwq
Content-Length: 10339
Cache-Control: max-age=0
Expires: Fri, 25 Nov 2016 08:21:19 GMT
Vary: Accept-Encoding
Access-Control-Allow-Origin: *.example.com
Connection: close
Content-Type: text/html; charset=UTF-8

O que tentei até agora

Dentro do .htacess eu tentei:

DirectorySlash Off

O que resultou em um 403 sem a barra

[steve@dev dev.www.example.com]$ curl -I https://dev.www.example.com/advice -k
  HTTP/1.1 403 Forbidden
  Date: Fri, 25 Nov 2016 08:53:15 GMT
  Server: Apache/2.4.6 (CentOS)
  Connection: close
  Content-Type: text/html; charset=iso-8859-1

Eu também adicionei a seguinte regra de reescrita, mas nada mudou

RewriteRule ^.*(advice)\/$ $1 [L,R=301]

Mais informações

Agora, advice é onde eu tenho uma plataforma de fórum instalada, no mesmo diretório que eu tenho um CMS instalado, algo como abaixo

├── advice
│   ├── admin.php
│   ├── api.php
│   ├── assets
│   ├── composer.json
│   ├── composer.lock
│   ├── config.php
│   ├── CONTRIBUTING.md
│   ├── index.php <-- Forum entry point
│   ├── LICENSE
│   ├── Procfile
│   ├── readme.md
│   ├── scripts
│   ├── storage
│   ├── Vagrantfile
│   └── vendor
├── assets
├── cms
├── codeception.yml
├── commands
├── composer.json
├── composer.lock
├── crontask
├── dropzone
├── email-helpers
├── favicon.ico
├── framework
├── gridfield-bulk-editing-tools
├── gridfieldextensions
├── index.php <-- CMS Entry point
├── kickassets
├── liveseo
├── minify
├── README.md
├── reports
├── setup.php
├── shortcodable
├── silverstripe-cache
├── siteconfig
├── _ss_environment.php
├── tests
├── themes
├── trait-loader
├── vendor
└── web.config

Versão do Apache Apache/2.4.6 (CentOS)

Você pode encontrar o conselho .htaccess aqui e o do cms aqui

Se isso ajudar o CMS a silverstripe e o fórum for flarum

    
por Steve 25.11.2016 / 10:11

1 resposta

1

Se você remover a barra em um diretório e ainda esperar que o documento de índice de diretório (nesse diretório) seja retornado, será necessário "corrigir" manualmente o URL, reescrevendo-o internamente no documento de índice. (Você basicamente precisa refazer o que você desfez, transformando o DirectorySlash Off .)

Tente algo como o seguinte antes de outras diretivas do mod_rewrite no arquivo raiz .htaccess :

DirectorySlash Off

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_URI} !/$
RewriteCond %{REQUEST_FILENAME}/index.php -f
RewriteRule (.*) $1/index.php [L]

Para todas as solicitações de diretórios físicos, elas não terminam em uma barra onde index.php existe nesse diretório e, em seguida, reescrevem internamente para index.php .

Alternativamente, você poderia apenas acrescentar a barra final (através de uma reescrita interna) e permitir que o mod_dir emita uma sub-requisição para o DirectoryIndex . Por exemplo:

RewriteRule (.*) $1/ [L]

Supondo que você tenha um DirectoryIndex set (o que você provavelmente tem se isso estivesse funcionando anteriormente), então mod_dir internamente reescreverá a requisição (estritamente uma sub-requisição) de /advice/ to /advice/index.php . No entanto, este é agora um processo de dois estágios, então você pode fazer isso tudo junto com o mod_rewrite (a menos que você tenha vários documentos de índice de diretório).

O acima é um caso geral para todos os diretórios. Você poderia ser mais específico e verificar apenas o diretório / URL em questão:

RewriteRule ^advice$ advice/index.php [L]

Se a solicitação for /advice , reescreva internamente para /advice/index.php - isso não verifica se é um diretório, apenas assumido.

    
por 25.11.2016 / 10:58