Как удалить расширение php, а также перенаправить расширения в форму без расширения

Как я могу иметь это в своем htaccess:

/page.php => redirects to /page
/page => shows the page.php
/index => redirects to root

И как удалить конечные косые черты со всех URL-адресов, особенно с корневого?

Хотя я недостаточно знаком с конфигами Apache, но смог найти вот такие коды:

# To remove .php extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

# To remove trailing slashes
RewriteRule ^(.*)/$ /$1 [L,R=301]

# To redirect /index to root (not sure if it works correctly)
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

Не могли бы вы помочь мне со сценарием и сделать его одним небольшим кодом?

Спасибо


Согласно ответам, я мог решить проблему, используя приведенные ниже коды в моем файле .htaccess:

# To remove .php extension
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ (.*)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]

# To redirect /index to root
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

Теперь у меня возникла новая проблема, и это когда я просматриваю файлы с косой чертой в конце, он перенаправляет меня куда-то еще и выдает ответ 404 (страница не найдена), например:

http://domain.tld/page/ => http://domain.tld/page/home/user/public_html/domain.tld/page

Также, если я передвигаю вторую часть в конец или вообще удаляю ее, сервер присылает мне ответ 500 (внутренняя ошибка сервера).


Наконец, проведя небольшое исследование, я смог найти решение предыдущей проблемы, используя этот совет:

https://stackoverflow.com/a/27264788/5420319

Итак, я изменил один из кодов:

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

К этому:

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L]

И я также переместил эту часть наверх, несмотря на то, что она эффективна.


person 4L3X    schedule 08.10.2015    source источник


Ответы (4)


Согласно ответам и моим собственным исследованиям, это будет окончательный ответ:

# To remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /(.*)/$
RewriteRule ^ /%1 [R=301,L]

# To remove .php extension
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ (.*)\.php [NC]
RewriteRule ^ %1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]

# To redirect /index to root
RewriteCond %{THE_REQUEST} ^.*/index
RewriteRule ^(.*)index.php$ /$1 [R=301,L]
person 4L3X    schedule 08.10.2015

Перенаправление page.php на /page:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\ /page\.php [NC]
RewriteRule ^ /page [R=301,L]

Теперь вернемся к page.php:

RewriteRule ^page$ /page.php [NC,L]

Удалить косую черту в конце:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

Теперь проверяем, существует ли файл для /some/page/foo такой, что /some/page/foo.php:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]
person hjpotter92    schedule 08.10.2015
comment
есть некоторые проблемы с вашими кодами. например, косая черта после страницы вызывает внутреннюю ошибку, в то время как предполагается перенаправление на страницу без косой черты. Другая проблема в том, что последний код вообще не работает. когда я просматриваю page.php, он остается с расширением и не перенаправляется на форму без расширения. Обратите внимание, что я не размещал первый и второй код, потому что они были специфичны для имени страницы, так как мне нужно что-то для работы со всеми файлами, а не только с page.php - person 4L3X; 08.10.2015
comment
Я также попробовал ваш первый код, и он не работал для этой конкретной страницы. Он перенаправляет с /page.php на /page, но после этого я получаю ответ 404 от сервера. - person 4L3X; 08.10.2015
comment
@ 4L3X Все правила идут в указанном порядке в одном и том же файле .htaccess. - person hjpotter92; 08.10.2015
comment
Кроме того, как я упоминал ранее в своих комментариях, не могли бы вы предоставить код, который не зависит от имени файла и работает со всем, а не только с page.php? - person 4L3X; 08.10.2015
comment
@4L3X В первом правиле (с %{THE_REQUEST}) измените шаблон на: ^[AZ]{3,}\ (.*)\.php [NC] и после этого RewriteRule ^ %1 [R=301 ,л] - person hjpotter92; 08.10.2015
comment
@4L3X Я пока пойду спать (здесь 2 часа ночи). Поместите текущий код вашего файла htaccess в вопрос выше, и я (или кто-либо другой) смогу помочь вам лучше. - person hjpotter92; 08.10.2015
comment
Хорошо, я включил текущую проблему в свой вопрос. Спасибо и спокойной ночи - person 4L3X; 08.10.2015

Очищенная и упрощенная версия принятого ответа:

# To remove trailing slash
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1 [R=301,L]

# To remove .php extension
RewriteRule ^(.*)\.php$ $1 [R=301,L]

# To check whether the file exists then set it back internally
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME}.php -f
RewriteRule ^.*$ $0.php [L]
person gahooa    schedule 20.05.2016

Options +FollowSymLinks
RewriteEngine on
AddHandler php5.3-fastcgi php
SetEnv no-gzip dont-vary

RewriteRule ^([a-z]+)$                                                  index.php?page=$1                                   [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)$                                      index.php?page=$1&subpage=$2                        [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)/([a-z0-9]+)$                          index.php?page=$1&subpage=$2&module=$3              [QSA,L]
RewriteRule ^([a-z]+)/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+)$              index.php?page=$1&subpage=$2&module=$3&submodule=$4 [QSA,L]

Вы можете играть с этим.

person Sates    schedule 08.10.2015
comment
Это буквально не переписывает, вызовет 500 и не отвечает на вопрос. - person Walf; 13.11.2016
comment
На самом деле, буквально, неожиданно, неудивительно, что с тех пор это работает, мистер Умный Зад. В противном случае я бы не смог его использовать, но я могу его использовать и использую. И он отлично работает, не вызывает 500 и красиво переписывает URL-адрес (кстати, я опубликовал ответ в ПОСЛЕДНЕМ ГОДУ в октябре, чувак. Так что расслабься, потому что ты только что дважды попал в грязь). Мат. Но это не дает точного ответа на вопрос. Это единственное, с чем я могу согласиться. - person Sates; 28.12.2016
comment
Работа на вас не делает это ни решением вопроса ОП, ни хорошим общим решением. Он не выполняет перенаправления, как спрашивал OP, может столкнуться с ошибкой, которую исправляет DPI, может быть заменен одним правилом (если вы лучше разбираетесь в regexen) и содержит специфичную для сервера конфигурацию. Это очень низкокачественный ответ. Возраст постов значения не имеет и мат? ВТФ чувак. - person Walf; 04.01.2017