Htaccess RewriteRule для отображения URL для обслуживания из одного файла - PullRequest
0 голосов
/ 01 ноября 2018

У меня был htaccess, который много лет работал с такой командой:

RewriteRule ^products/(.*).php  product.php?page=$1&%{QUERY_STRING}

Сопоставление всех элементов в папке products с файлом product.php

Сегодня внезапно все URL начали выдавать 404. После многих часов копания я обнаружил, что команда теперь работает, только если в папке продуктов есть фактический файл (даже пустой файл - это не имеет значения). Например, products / p1.php будет работать, только если p1.php находится в папке products.

Я также запустил тест и добавил:

RewriteRule ^tests/(.*).php  tests/index.php

и файл index.php в папке тестов с hello world. Это будет работать только для файлов, которые на самом деле в папке тестов tests / testing.php покажет содержимое index.php только в том случае, если в папке tests находится файл test.php.

Кто-нибудь имеет представление о том, что могло измениться в конфигурации сервера, чтобы вызвать это, или если есть способ исправить мою команду для работы без фактического файла в расположении URL-адреса?

Отредактировано 1 ноября 2018 года:

Я нашел это в httpd.conf:

<IfModule proxy_fcgi_module>
<FilesMatch \.(phtml|php[0-9]*)$>
SetHandler proxy:unix:/opt/cpanel/ea-php70/root/usr/var/run/php-fpm/.sock|fcgi://mydomain.com
</FilesMatch>
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule (.*) - [H=text/html]
</IfModule>

Может ли это быть причиной?

Еще одно обновление:

Итак, эта строка

RewriteRule ^tests/(.*)  tests/index.php

Будет работать для существующих файлов, а также для несуществующего каталога. так что тесты / dir1 / перенаправят нормально. Но test / file.php будет перенаправлять, только если файл file.php действительно существует.

Еще одно обновление (извините, я отлаживаю его и нахожу наши дополнительные материалы):

Перенаправление не удастся только для файлов PHP! все остальные файлы будут работать правильно.

Окончательное решение:

Эти три строки в httpd.conf необходимо прокомментировать.

RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-f
RewriteRule (.*) - [H=text/html]

Я подозреваю, что они автоматически генерируются некоторыми обновленными Cpanel и попытаются сообщить об этом им.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

yshaool У меня точно такая же проблема с тобой. Мой поиск решения привел меня также к httpd.conf. Я закомментировал 3 строки перезаписи и перезапустил Apache. Теперь все работает хорошо. Я боюсь, что это автоматически сгенерированный файл, и он будет перезаписан через некоторое время.

0 голосов
/ 01 ноября 2018

Сначала вам нужно сделать жизнь более понятной и прекратить дальнейшее выполнение правил с помощью опции [L]:

RewriteRule ^products/(.*).php  product.php?page=$1&%{QUERY_STRING} [L]

Если не поможет - будут правила до того, как ваша цитата исполнится с приоритетом.

Что-то с

RewriteCond %{REQUEST_FILENAME} !-f

состояние. Проверьте ваш .htaccess, если у вас есть эти правила. Если вы управляете папкой /etc/apache2/ или /etc/httpd/ - проверьте настройки корневого веб-сервера. В противном случае вам нужно связаться с вашим хостинг-провайдером.

...