Мои правила перезаписи предназначены для того, чтобы скрыть мою структуру каталогов и облегчить чтение URL-адресов. В gcems
сайт работает должным образом, а vigotwpfd
site не будет загружать файлы за пределами первой страницы, а также выдает ошибку на первой странице.
Вот моя установка:
Платформа разработки: оба сайта работают по назначению.
Платформа «Live / Testing»: одна машина, на которой работает один экземпляр Apache 2.4 в Linux.
Одно динамическое IP-соединение с Интернетом.
Два имени хоста, оба используют duckdns.org в качестве моего поставщика динамических IP. gcems.duckdns.org
и vigotwpfd.duckdns.org
настроить как виртуальные хосты.
Оба сайта работают под управлением PHP 7.x
Оба сайта настроены очень похоже. Та же структура каталогов. Файловые структуры аналогичны. Оба используют правила перезаписи URL, которые идентичны, за исключением того, что правила URL для gcems
указать на gcems
и правила для vigotwpfd
указать на vigotwpfd
.
Файлы конфигурации домена Apache и .htacess
файлы также идентичны, за исключением gcems
против vigotwpfd
.
Ниже приводится упрощенная структура каталогов / файлов для обоих доменов.
vigotwpfd
==> /var/www/vigotwpfd
gcems
==> /var/www/html
/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
.htaccess
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$
apache2/sites-enabled/gcems.duckdns.org.conf
<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>
сообщение об ошибке найдено в vigotwpfd_error.log
[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/
https://github.com/pavulon18/vigotwp
https://github.com/pavulon18/gcas_timesheet_php_website
Вот мои теории:
vigotwpfd
сайт или сам сервер)Я бежал vigotwpfd
шаг за шагом через отладчик, но мне еще предстоит выяснить, в чем моя проблема.
Дополнительная информация и пояснения
В первой итерации своего вопроса я пытался сэкономить место и уменьшить шум, разместив то, что я считал абсолютно необходимым. Я опубликую все содержимое файлов в этой редакции. Я также собираюсь ответить на некоторые из представленных вопросов и опасений.
В) «но из опубликованного вами журнала ошибок может показаться, что ваша перезапись URL-адреса вообще не обрабатывается? - MrWhite»
А) Это одна из самых больших загадок всей этой ситуации. Эта установка, как указано, работает на gcems
сайт, но не на vigotwpfd
сайт. Я пытаюсь определить, в чем разница между ними.
Q) "Директивы в .htaccess
отправленные вами файлы расположены в неправильном порядке, и вы, кажется, (вроде как) продублировали свою основную перезапись? (Между прочим, вы упомянули “htaccess”
с одной буквой «c» ранее в вашем вопросе - я полагаю, это просто опечатка в вашем вопросе?) - MrWhite вчера "
А) Я исправлю упомянутое вами дублирование. В этом обновлении я решил сохранить оригинал, чтобы существенно не изменить предпосылку вопроса. Да, единственная буква «с» была простой опечаткой. Я дважды трижды проверил имя файла после того, как вы упомянули об этой ошибке.
Комментарий: MrWhite, я заметил, что вы удалили мой PHP
тег. Причина, по которой я указал это, заключается в том, что ошибка может быть где-то в моем PHP
код. Я двигаю PHP
тег должен быть восстановлен.
на gcems: если я наберу https://gcems.duckdns.org, Я получаю главную страницу сайта без сообщений об ошибках. если я наберу https://gcems.duckdns.org/some_random_characters, веб-сайт выдаст сообщение об ошибке «Класс контроллера не существует». Мой код перехватывает неверный запрос каталога / файла и отображает это сообщение вместо 404 error
.
на vigotwpfd: если я наберу https://vigotwpfd.duckdns.org, Я получаю указанное выше сообщение об ошибке. Если я напечатаю https://vigotwpfd.duckdns.org/some_random_characters, Я получаю ошибку apache «Не найдено. Запрошенный URL / some_random_characters не найден на этом сервере».
/etc/apache2/sites-enabled/gcems.duckdns.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 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
/etc/apache2/sites-enabled/gcems.duckdns.org.ssl.conf
<VirtualHost *:80>
ServerName gcems.duckdns.org
<Location />
Redirect permanent / https://gcems.duckdns.org/
</Location>
</VirtualHost>
<VirtualHost *:443>
ServerAdmin webmaster@gcems.duckdns.org
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>
/var/www/html/.htaccess
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/vigotwpfd.duckdns.org.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
/etc/apache2/sites-enabled/vigotwpfd.duckdns.org.ssl.conf
<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
/var/www/vigotwpfd/.htaccess
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>
Кажется, у вас два <VirtualHost *:80>
контейнеры для того же ServerName
(для обоих gcems
и vigotwpfd
)? Только один из них может быть успешным - первый, который определен в конфигурации сервера (после обработки включений). Итак, я подозреваю, что перенаправление с HTTP на HTTPS не происходит в конфигурации вашего сервера, поэтому у вас есть перенаправление mod_rewrite HTTP на HTTPS в вашем .htaccess
файл.
... где
AllowOverride
директива?
Поскольку вы опубликовали всю свою (?) Конфигурацию vHost, все еще нет AllowOverride
директива в любом месте вашего config. Ваш .htaccess
перезаписи / перенаправления не будут работать без соответствующего AllowOverride
директива где-то в конфигурации вашего сервера (в <Directory>
контейнер). И ошибки PHP (и Apache 404), которые вы получаете, соответствуют .htaccess
(т.е. mod_rewrite) ничего не делает.
Делает http://vigotwpfd.duckdns.org
перенаправить на HTTPS? (Я только что проверил - нет). Это также предполагает, что .htaccess
/ mod_rewrite ничего не делает.
Теперь у вас нет AllowOverride
директива для любого хоста, но gcems
"работает нормально". Возможно, вы заблудились <Directory /var/www/html>
контейнер в конфигурации вашего основного сервера, который включает это для gcems
, но не для /var/www/vigotwpfd
? В любом случае это должно быть определено в vHost, а не в конфигурации основного сервера.
Уведомление PHP: неопределенный индекс: контроллер в ...
Если перезапись была обработана в .htaccess
тогда вы не получите это «Уведомление о PHP», так как $_GET['controller']
всегда будет определяться. (Что, я полагаю, вы имеете в виду где-то в своем PHP-коде?) Однако ваш PHP-код всегда должен проверять, существуют ли параметры URL-адреса в любом случае, и использовать их по умолчанию, если нет. Таким образом, вы не должны видеть этот E_NOTICE ни при каких обстоятельствах.