Dois sites semelhantes, uma vez que a instância do Apache, a reescrita do url funciona em uma, mas não na outra

3

Minhas regras de reescrita são projetadas para ocultar minha estrutura de diretórios e facilitar a leitura de URLs. O site gcems funciona como esperado, enquanto o site vigotwpfd não carregará os arquivos além da primeira página, além de gerar um erro na primeira página.

Aqui está minha configuração:

Plataforma de desenvolvimento: os dois sites funcionam conforme o esperado.

Plataforma "Live / Testing": Uma máquina executando uma instância do Apache 2.4 no Linux.

Uma conexão IP dinâmica com a Internet.

Dois nomes de host, ambos usando o duckdns.org como meu provedor de IP dinâmico. gcems.duckdns.org e vigotwpfd.duckdns.org configuração como hosts virtuais.

Ambos os sites estão executando o PHP 7.x

Ambos os sites são configurados de forma muito semelhante. Mesma estrutura de diretório. Estruturas de arquivos são semelhantes. Ambos usam regras de reescrita de URL, que são idênticas, com a exceção de que as regras de URL para gcems apontam para gcems e as regras para vigotwpfd apontam para vigotwpfd .

Os arquivos de configuração de domínio do Apache e os arquivos .htacess também são idênticos, com exceção de gcems vs vigotwpfd .

O seguinte é uma estrutura de diretório / arquivo simplificada para ambos os domínios.

  • vigotwpfd == > %código%
  • /var/www/vigotwpfd == > %código%
/var/www/site/
|-- assets
|   |-- css
|   |   '-- view.css
|   |-- gallery
|   |   '-- blank.jpg
|   |-- htc
|   |   '-- iepngfix.htc
|   |-- images
|   |   '-- <image files>
|   '-- js
|       '-- <javascript files>
|-- classes
|   |-- Bootstrap.php
|   |-- Controller.php
|   |-- Messages.php
|   '-- Model.php
|-- controllers
|   '-- <controller files>
|-- models
|   '-- <models files>
|-- views
|   |-- <other directories and php web pages>
|   '-- main.php
|-- config.php
|-- .htaccess
'-- index.php

gcems

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L]
Options +FollowSymLinks
RewriteEngine on

RewriteCond %{SERVER_PORT} 80
# This checks to make sure the connection is not already HTTPS -  port 80 indicates a non-secured HTTP conection.

RewriteRule ^(.*)$ https://site.duckdns.org/$1 [R=301,L]
# This rule will redirect users from their original location to the same location but using HTTPS.

RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&i$

/var/www/html

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName gcems.duckdns.org
        ServerAlias *.gcems.duckdns.org
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/gcems_error.log
        CustomLog ${APACHE_LOG_DIR}/gcems_access.log combined
</VirtualHost>

mensagem de erro encontrada em .htaccess

[Mon Nov 05 08:33:40.101435 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP Notice:  Undefined index: controller in /var/www/vigotwpfd/classes/Bootstrap.php on line 38, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.101670 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP Stack trace:, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.101784 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP   1. {main}() /var/www/vigotwpfd/index.php:0, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.101914 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP   2. Bootstrap->__construct() /var/www/vigotwpfd/index.php:60, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.102365 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP Notice:  Undefined index: action in /var/www/vigotwpfd/classes/Bootstrap.php on line 45, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.102488 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP Stack trace:, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.102556 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP   1. {main}() /var/www/vigotwpfd/index.php:0, referer: https://vigotwpfd.duckdns.org/
[Mon Nov 05 08:33:40.102630 2018] [:error] [pid 2993] [client 107.77.210.136:29694] PHP   2. Bootstrap->__construct() /var/www/vigotwpfd/index.php:60, referer: https://vigotwpfd.duckdns.org/

link
link

Aqui estão minhas teorias:

  1. Há um problema no sistema de reescrita de URL
  2. Há um problema nas configurações do apache (para o site apache2/sites-enabled/gcems.duckdns.org.conf ou para o próprio servidor)
  3. Meu código está confuso.

Eu executei vigotwpfd_error.log passo a passo através de um depurador, mas ainda não descobri qual é o meu problema.

Informações adicionais e esclarecimentos

Na primeira iteração da minha pergunta, eu estava tentando economizar espaço e reduzir algum ruído postando o que eu achava que era absolutamente essencial. Vou postar todo o conteúdo dos arquivos nesta edição. Também vou responder algumas das perguntas e preocupações que foram apresentadas.

Q) "mas o log de erro que você postou parece sugerir que a sua reescrita de URL não está sendo processada de forma alguma? - MrWhite"
A) Este é um dos grandes enigmas de toda esta situação. Essa configuração, como fornecida, funciona no site vigotwpfd , mas não no site vigotwpfd . Eu estou tentando determinar qual é a diferença entre os dois.

Q) "As diretivas no arquivo gcems que você postou estão na ordem errada e você parece ter (meio que) duplicado sua reescrita principal? (Btw, você se referiu a vigotwpfd com uma "C" no início da sua pergunta - eu assumo que este é apenas um erro de digitação em sua pergunta?) - MrWhite ontem "
A) Eu vou consertar a duplicação que você mencionou. Para esta atualização, optei por manter o original apenas para não alterar significativamente a premissa da questão. Sim, o single "c" foi um simples erro de digitação. Eu duplamente triplo verifiquei o nome do arquivo depois que você mencionou este erro.

Comentário: MrWhite, notei que você removeu minha tag .htaccess . A razão pela qual listei isso é devido à possibilidade de que o erro esteja em algum lugar no meu código “htaccess” . Eu movo que a tag PHP deve ser reintegrada.

em gcems: se eu digitar o link , recebo a página principal do site, sem mensagens de erro. se eu digitar o link , o site enviará uma mensagem de erro "A classe do controlador não existe" . Meu código captura a solicitação de diretório / arquivo incorreta e exibe essa mensagem em vez do PHP .

em vigotwpfd: Se eu digitar o link , recebo a mensagem de erro listada acima. Se eu digitar o link , recebo um erro de apache "Não encontrado. A URL solicitada / some_random_characters não foi encontrada neste servidor "

PHP

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    ServerAdmin webmaster@localhost
    ServerName gcems.duckdns.org
    # ServerAlias *.gcems.duckdns.org
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/gcems_error.log
    CustomLog ${APACHE_LOG_DIR}/gcems_access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

404 error

<VirtualHost *:80>
        ServerName gcems.duckdns.org
        <Location />
                Redirect permanent / https://gcems.duckdns.org/
        </Location>
</VirtualHost>
<VirtualHost *:443>
        ServerAdmin [email protected]
        ServerName gcems.duckdns.org
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/gcems_error.log
        CustomLog ${APACHE_LOG_DIR}/gcems_access.log combined
        SSLEngine On
        SSLCertificateFile <directory>/fullchain.pem
        SSLCertificateKeyFile <directory>/privkey.pem
</VirtualHost>

/etc/apache2/sites-enabled/gcems.duckdns.conf

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L]
Options +FollowSymLinks
RewriteEngine on

RewriteCond %{SERVER_PORT} 80
# This checks to make sure the connection is not already HTTPS -  port 80 indicates a non-secured HTTP conection.

RewriteRule ^(.*)$ https://gcems.duckdns.org/$1 [R=301,L]
# This rule will redirect users from their original location to the same location but using HTTPS.

RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&i$

<IfModule mod_expires.c>
  ExpiresActive ON
  ExpiresDefault "access plus 1 seconds"
</IfModule>

/etc/apache2/sites-enabled/gcems.duckdns.org.ssl.conf

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    ServerAdmin webmaster@localhost
    ServerName vigotwpfd.duckdns.org
    # ServerAlias *.vigotwpfd.duckdns.org
    DocumentRoot /var/www/vigotwpfd

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/vigo_error.log
    CustomLog ${APACHE_LOG_DIR}/vigo_access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

/var/www/html/.htaccess

<VirtualHost *:80>
    ServerName vigotwpfd.duckdns.org
    <Location />
            Redirect permanent / https://vigotwpfd.duckdns.org/
    </Location>
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName vigotwpfd.duckdns.org
#       ServerAlias *.vigotwpfd.duckdns.org
    DocumentRoot /var/www/vigotwpfd

    ErrorLog ${APACHE_LOG_DIR}/vigo_error.log
    CustomLog ${APACHE_LOG_DIR}/vigo_access.log combined

    SSLEngine On
    SSLCertificateFile /var/lib/dehydrated/certs/vigotwpfd.duckdns.org/fullchain.pem
    SSLCertificateKeyFile /var/lib/dehydrated/certs/vigotwpfd.duckdns.org/privkey.pem

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

/etc/apache2/sites-enabled/vigotwpfd.duckdns.org.conf

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&id=$3 [NC,L]
Options +FollowSymLinks
RewriteEngine on
LogLevel alert rewrite:trace3

RewriteCond %{SERVER_PORT} 80
# This checks to make sure the connection is not already HTTPS -  port 80 indicates a non-secured HTTP conection.

RewriteRule ^(.*)$ https://vigotwpfd.duckdns.org/$1 [R=301,L]
# This rule will redirect users from their original location to the same location but using HTTPS.

RewriteRule ^([a-zA-Z]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&action=$2&i$

<IfModule mod_expires.c>
  ExpiresActive ON
  ExpiresDefault "access plus 1 seconds"
</IfModule>
    
por Jim Baize 05.11.2018 / 20:56

1 resposta

0

Você parece ter dois <VirtualHost *:80> contêineres para o mesmo ServerName (para gcems e vigotwpfd )? Apenas um deles pode ser bem-sucedido - o primeiro que é definido na configuração do servidor (depois que os includes foram processados). Então, eu suspeito que o redirecionamento de HTTP para HTTPS não está ocorrendo na configuração do seu servidor, e é por isso que você tem um redirecionamento mod_rewrite HTTP para HTTPS no seu arquivo .htaccess .

... where is the AllowOverride directive?

Como você postou toda a configuração do vHost, ainda não há uma diretiva AllowOverride em qualquer lugar da sua configuração. Seus .htaccess reescrever / redirecionamentos não funcionarão sem uma diretiva AllowOverride apropriada em algum lugar na configuração do seu servidor (em um contêiner <Directory> ). E os erros do PHP (e do Apache 404) que você está obtendo são consistentes com .htaccess (ou seja, mod_rewrite) não fazendo nada.

O http://vigotwpfd.duckdns.org redireciona para HTTPS? (Acabei de verificar - não) Isso sugere ainda que .htaccess / mod_rewrite não está fazendo nada.

Agora, você não tem uma diretiva AllowOverride para nenhum dos hosts, mas gcems está "funcionando bem". É possível que você tenha um contêiner <Directory /var/www/html> perdido na configuração do servidor principal que está habilitando isso para gcems , mas não para /var/www/vigotwpfd ? De qualquer forma, isso deve ser definido no vHost, não na configuração principal do servidor.

PHP Notice: Undefined index: controller in ...

Se a reescrita fosse processada em .htaccess , você não receberia este "aviso do PHP", pois $_GET['controller'] seria sempre definido. (Que eu suponho que você deve estar se referindo a algum lugar em seu código PHP?) No entanto, seu código PHP deve sempre verificar se os parâmetros de URL existem de qualquer maneira e se não o padrão. Então, você não deveria estar vendo este E_NOTICE em nenhuma circunstância.

    
por 13.11.2018 / 02:05