Почему файл .htaccess выдаёт ошибку из-за символа $ в конце строки?

Как можно изменить .htaccess файл таким образом, чтобы страница /channel/53089/ открывалась корректно, но при этом не открывались другие варианты строки после числовой части URL (/channel/53089/jhkjhj/ или /channel/53089/jhkjhj/sdfkjshfdkjshfd/)? Как исправить ошибку, которая возникает после добавления символа $ в правило RewriteRule?
  • 23 августа 2024 г. 18:04
Ответы на вопрос 3
Ошибка возникает из-за того, что символ $ в регулярном выражении используется для указания конца строки. Поэтому, если добавить символ $ в правило RewriteRule, то оно будет применяться только к URL, которые точно соответствуют всей строке, но не к URL, которые содержат дополнительные символы после числовой части.

Для того чтобы страница /channel/53089/ открывалась корректно, но при этом не открывались другие варианты строки после числовой части URL, можно использовать следующее правило в файле .htaccess:

RewriteEngine On
RewriteRule ^channel/([0-9]+)/$ /channel/$1/ [L]

Это правило будет перенаправлять все URL, которые начинаются с /channel/, за которыми идет числовая часть, и заканчиваются на /, на URL с тем же числовым значением, но с добавлением / в конце.

Таким образом, если ввести /channel/53089/jhkjhj/ или /channel/53089/jhkjhj/sdfkjshfdkjshfd/, они не будут перенаправлены, а если ввести /channel/53089/, он будет перенаправлен на /channel/53089/.

Также, чтобы избежать ошибки после добавления символа $ в правило RewriteRule, необходимо убедиться, что перед и после символа $ нет лишних пробелов или других символов.
Ломается вот из-за этой конструкции: 
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

Если её убрать, то всё работает.
С ней сообщение в логе:
AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

Собственно, частью про 'LogLevel debug' я и рекомендую Вас воспользоваться для удовлетворения любопытства
Перенести RewriteRule ^channel выше RewriteRule ^(.*)$ $1.php 

RewriteEngine On

RewriteBase /

# Редирект с http на https создан автоматически при заказе бесплатного ssl-сертификата
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
# Конец редиректа

RewriteRule ^channel/([^/]+)/edit edit/card.php?id=$1 [L,QSA]
RewriteRule ^channel/([^/]+)/$ channel.php?id=$1 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

ErrorDocument 404 /errors/404.php


Или поменять условие RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteEngine On

RewriteBase /

# Редирект с http на https создан автоматически при заказе бесплатного ssl-сертификата
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R,L]
# Конец редиректа

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.*)$ $1.php [L]

RewriteRule ^channel/([^/]+)/edit edit/card.php?id=$1 [L,QSA]
RewriteRule ^channel/([^/]+)/$ channel.php?id=$1 [L,QSA]

ErrorDocument 404 /errors/404.php
Похожие вопросы