Как удалить расширение .php только у одного или нескольких конкретных файлов, а не у всех?

Добрый день! <br/> Мне нужно настроить редирект с файла /contacts.php на /contacts. Я нашел следующий код: <br/> <pre><code>RewriteEngine on
RewriteCond %{REQUEST_URI} ^/contacts$
RewriteRule ^ contacts.php</code></pre> <br/> Однако файл доступен как по адресу /contacts.php, так и по /contacts. При этом, если я отдельно укажу Redirect 301, возникает бесконечный редирект. <br/> <br/> Также я наткнулся на другой код: <br/> <pre><code>RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L,QSA]
RewriteCond %{THE_REQUEST} ([^\s]*)\.php(\?[^\s]*)?
RewriteRule (.*) %1 [R=301,L]</code></pre> <br/> Этот код работает правильно, но применяется ко всем файлам .php. Есть ли возможность адаптировать его для работы только с одним файлом? Или существует другое решение для задачи? <br/> Пожалуйста, не спрашивайте о причинах, это пожелание клиента.
  • 16 сентября 2024 г. 7:03
Ответы на вопрос 2
Да, вы можете адаптировать ваш код, чтобы удалять расширение `.php` только для конкретного файла, например, `/contacts.php`. Вот пример того, как это можно сделать:

```apache
RewriteEngine on

# Убедитесь, что файл contacts.php существует и удаляем расширение .php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^contacts$ contacts.php [L,QSA]

# Редирект с .php на /contacts только для requests на /contacts.php
RewriteCond %{THE_REQUEST} \s/contacts\.php[\s?] [NC]
RewriteRule ^contacts\.php$ /contacts [R=301,L]
```

### Объяснение:

1. **Удаление расширения `.php`:**
   - Первая часть проверяет, если файл не является физическим (`!-f`) или директорией (`!-d`), и существует ли файл `contacts.php` (проверка `RewriteCond %{REQUEST_FILENAME}.php -f`).
   - Если условия выполняются, тогда происходит замена запроса `/contacts` на `/contacts.php`.

2. **Ручной редирект с `.php` на безрасширенческий вариант:**
   - Вторая часть кода проверяет, поступил ли запрос для `contacts.php`, и если это так, выполняется редирект на `/contacts` с помощью статус-кода 301.

С помощью такого настроенного кода, вы получите желаемый результат, не затрагивая другие файлы `.php`.

Попробуйте добавить этот код в ваш `.htaccess` файл и протестировать. Если что-то не работает, убедитесь, что модуль `mod_rewrite` включен на вашем сервере.
RewriteEngine On

RewriteCond %{THE_REQUEST} ^\S+\s/contacts\.php
RewriteRule ^ /contacts [R=301,L]

RewriteRule ^contacts$ /contacts.php [L]


Или так
RewriteEngine On

RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^contacts\.php  /contacts [R=301,L]

RewriteRule ^contacts$ /contacts.php [L]
Похожие вопросы