Удалите расширение .php с помощью .htaccess

101

Да, я прочитал руководство по Apache и искал здесь. По какой-то причине я просто не могу заставить это работать. Самое близкое, что я пришел, - это удалить расширение, но оно указывает на корневой каталог. Я хочу, чтобы это просто работало в каталоге, содержащем .htaccessфайл.

Мне нужно сделать с .htaccessфайлом три вещи .

  1. Мне нужно удалить .php

    а. У меня есть несколько страниц, которые используют вкладки, а URL-адрес выглядит как page.php # tab - возможно ли это?

    б. У меня есть одна страница, которая использует идентификатор сеанса, добавленный к URL-адресу, чтобы убедиться, что вы пришли из нужного места www.domain.com/download-software.php?abcdefg.

Это возможно? Также при этом нужно удалить ".php" из ссылок в моем заголовочном файле включения навигации? ДолженIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Я бы хотел, чтобы перед каждым URL-адресом было принудительно "www", так что это не так domain.com, но www.domain.com/page.
  2. Я хочу удалить со страниц все конечные косые черты.

Я буду искать, пробовать и т. Д. Вызвать ли какие-либо проблемы нахождение в подкаталоге?

Грязный Дизайн Птицы
источник
Мне просто любопытно, какая в этом польза? Это значит, что ваши пользователи не знают, к какому файлу на вашем сервере они обращаются?
Каньон Колоб
в два раза. поэтому они не знают, какие типы файлов мы обслуживаем, и это просто выглядит чище ИМО
Dirty Bird Design
Другой связанный с этим вопрос: stackoverflow.com/questions/6534904/… .
Эдвард

Ответы:

123

Ответ Gumbo на вопрос о переполнении стека Как скрыть расширение .html с помощью Apache mod_rewrite должно работать нормально.

Re 1) Измените .html на .php

Re a.) Да, это возможно, просто добавьте #tabв URL.

Re b.) Это возможно с помощью QSA(Query String Append), см. Ниже.

Это также должно работать в пути к подкаталогу:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]
Пекка
источник
спасибо за ваш помощник, по какой-то причине, я бы сделал ставку из-за того, что добавленный URL-адрес сеанса жестко закодирован в файле PHP (длинная история), я могу получить к нему доступ без вышеуказанного. Я очень ценю вашу помощь, этот файл .htaccess для меня непрост.
Dirty Bird Design
8
@Pekka 웃 удалите пробелы между [L,пробелами QSA], иначе вызовет 500 Internal Server Error .
Рахил Вазир
это будет /index/bla/blaто же самое, что иindex.php
elkebirmed
по какой-то причине этот CSS блокирует загрузку: /
TheCrazyProfessor 05
! значит нет. Это правило гласит, что нужно перезаписывать, добавляя .php, только если он еще не заканчивается на .php
user339568
72

Apache mod_rewrite

То, что вы ищете, это mod_rewrite ,

Описание: Предоставляет основанный на правилах механизм перезаписи для перезаписи запрошенных URL-адресов на лету.

Вообще говоря, mod_rewriteработает путем сопоставления запрошенного документа с указанными регулярными выражениями, а затем выполняет перезапись URL-адресов внутри (в процессе apache) или извне (в браузере клиента). Эти изменения могут быть такими же простыми, как внутренний перевод example.com/foo в запрос для example.com/foo/bar.

Документация Apache включает mod_rewriteруководство, и я думаю, что в нем описаны некоторые из вещей, которые вы хотите сделать. Подробное руководство по mod_rewrite .

Принудительно wwwсубдомен

Я бы хотел, чтобы он заставлял "www" перед каждым URL-адресом, поэтому это не domain.com, а www.domain.com/page

Руководство по перезаписи включает инструкции для этого в примере с каноническим именем хоста .

Убрать косые черты в конце (часть 1)

Я хочу удалить со страниц все конечные косые черты

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

Проблема с конечной косой чертой

Описание:

Каждый веб-мастер может спеть песню о проблеме косой черты в URL, ссылающихся на каталоги. Если они отсутствуют, сервер выдает сообщение об ошибке, потому что, если вы скажете /~quux/fooвместо, /~quux/foo/ то сервер будет искать файл с именем foo. И поскольку этот файл является каталогом, он жалуется. На самом деле в большинстве случаев он пытается исправить это сам, но иногда вам нужно эмулировать этот механизм. Например, после того, как вы выполнили множество сложных переписываний URL-адресов в сценарии CGI и т. Д.

Возможно, вы могли бы подробнее объяснить, почему вы хотите все время убирать завершающую косую черту?

Удалить .phpрасширение

Мне нужно удалить .php

Самое близкое к этому, что я могу придумать, - это внутренне переписывать каждый документ запроса с расширением .php, т.е. example.com/somepage вместо этого обрабатывается как запрос для example.com/somepage.php. Обратите внимание, что для этого потребуется, чтобы каждая страница somepage действительно существовала как somepage.php в файловой системе.

В некоторой степени это должно быть возможно при правильной комбинации регулярных выражений. Однако я могу предвидеть некоторые возможные проблемы с некорректным запросом индексных страниц и некорректным соответствием каталогов.

Например, это правильно перепишет example.com/test как запрос example.com/test.php:

RewriteEngine  on
RewriteRule ^(.*)$ $1.php

Но приведет к тому, что example.com не загрузится, потому что нет example.com/.php

Я собираюсь предположить, что если вы удалите все завершающие косые черты, то выбор запроса индекса каталога из запроса имени файла в родительском каталоге станет практически невозможным. Как определить запрос к каталогу foobar:

example.com/foobar

из запроса файла с именем foobar (который на самом деле является foobar.php)

example.com/foobar

Это могло быть возможно, если бы вы использовали RewriteBaseдирективу. Но если вы это сделаете, эта проблема станет намного сложнее, так как вам потребуются RewriteCondдирективы для проверки уровня файловой системы, отображается ли запрос на каталог или файл.

Тем не менее, если вы удалите свое требование об удалении всех конечных косых черт и вместо этого принудительно добавите конечные косые черты, проблема "без расширения .php" станет немного более разумной.

# Turn on the rewrite engine
RewriteEngine  on
# If the request doesn't end in .php (Case insensitive) continue processing rules
RewriteCond %{REQUEST_URI} !\.php$ [NC]
# If the request doesn't end in a slash continue processing the rules
RewriteCond %{REQUEST_URI} [^/]$
# Rewrite the request with a .php extension. L means this is the 'Last' rule
RewriteRule ^(.*)$ $1.php [L]

Это все еще не идеально - каждый запрос файла по-прежнему имеет .php, добавленный к запросу внутри. Запрос на 'hi.txt' поместит это в ваши журналы ошибок:

[Tue Oct 26 18:12:52 2010] [error] [client 71.61.190.56] script '/var/www/test.peopleareducks.com/rewrite/hi.txt.php' not found or unable to stat

Но есть еще один вариант, установить DefaultTypeи DirectoryIndexдирективы , как это:

DefaultType application/x-httpd-php
DirectoryIndex index.php index.html

Обновление 2013-11-14 - исправлен приведенный выше фрагмент, чтобы включить наблюдение Никореллиуса.

Теперь запросы на hi.txt (и все остальное) успешны, запросы на example.com/test вернут обработанную версию test.php, а файлы index.php снова будут работать.

Я должен отдать должное этому решению, так как я нашел его в блоге Майкла Дж. Радвинса, выполнив поиск в Google по запросу php no extension apache .

Удалить завершающие косые черты

Некоторые поисковые запросы apache remove trailing slashesпривели меня к некоторым страницам поисковой оптимизации. Очевидно, некоторые системы управления контентом (в данном случае Drupal) будут делать контент доступным с косой чертой в конце URls и без нее, что в мире SEO приведет к штрафу за дублирование контента на вашем сайте. Источник

Решение кажется довольно тривиальным: mod_rewriteмы переписываем при условии, что запрошенный ресурс заканчивается на a, /и перезаписываем URL, отправляя обратно 301 Permanent RedirectHTTP-заголовок.

Вот его пример, который предполагает, что ваш домен - blamcast.net, и допускает возможность добавления префикса к запросу www..

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?blamcast\.net$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Теперь мы куда-то идем. Давайте соберем все вместе и посмотрим, как это выглядит.

Обязательно www., нет .phpи без слешей в конце

Предполагается, что домен - foobar.com и работает на стандартном порту 80.

# Process all files as PHP by default
DefaultType application/x-httpd-php
# Fix sub-directory requests by allowing 'index' as a DirectoryIndex value
DirectoryIndex index index.html

# Force the domain to load with the www subdomain prefix
# If the request doesn't start with www...
RewriteCond %{HTTP_HOST}   !^www\.foobar\.com [NC]
# And the site name isn't empty
RewriteCond %{HTTP_HOST}   !^$
# Finally rewrite the request: end of rules, don't escape the output, and force a 301 redirect
RewriteRule ^/?(.*)         http://www.foobar.com/$1 [L,R,NE]

#get rid of trailing slashes
RewriteCond %{HTTP_HOST} ^(www.)?foobar\.com$ [NC]
RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]

Флаг «R» описан в разделе RewriteRuleдиректив. Фрагмент:

redirect|R [=code](принудительное перенаправление) Замена префикса на http://thishost[:thisport]/(что делает новый URL-адрес URI) для принудительного внешнего перенаправления. Если код не указан, будет возвращен ответ HTTP 302 ( ВРЕМЕННО ПЕРЕМЕЩЕН ).

Заключительное примечание

Мне не удалось добиться успешного удаления косой черты. В итоге перенаправление дало мне бесконечные циклы перенаправления. После ознакомления с исходным решением у меня сложилось впечатление, что приведенный выше пример работает для них из-за того, как настроена их установка Drupal. Он особо отмечает:

На обычном сайте Drupal с включенными чистыми URL-адресами эти два адреса в основном взаимозаменяемы.

В отношении URL-адресов, заканчивающихся косой чертой и без нее. Более того,

Drupal использует файл, .htaccessкоторый сообщает вашему веб-серверу, как обрабатывать URL-адреса. Это тот же файл, который задействует магию чистых URL-адресов в Drupal. Добавив простую команду перенаправления в начало .htaccessфайла, вы можете заставить сервер автоматически удалять любые завершающие косые черты.

Тим Белява
источник
вау, спасибо за все это. На самом деле мне удалось заставить его работать, но оказалось, что на моем сервере были какие-то странные вещи, которые мне пришлось изменить. В любом случае, теперь к следующей проблеме, удалив .php со всех страниц, кроме одной. thx man
Dirty Bird Design
Я люблю видеть хорошо продуманные, организованные ответы. Хорошая работа ... Я заметил одну вещь: вы имели в виду DirectoryIndex index index.html? или DirectoryIndex index.php index.html?
Никореллиус 08
@nicorellius считает, что вы правы. Я обновил свой исходный ответ вашим наблюдением.
Тим Белява
Я должен сказать, что это не всегда работает. Попробуйте ответ ниже (пользователя 1079877)
DonJoe 09
Вы настоящий MVP.
ZainZaheer06
45

В дополнение к другим ответам выше,

Вы также можете попробовать это, чтобы полностью удалить расширения .php из вашего файла и избежать бесконечного цикла :

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ $1.php [NC,L]

Этот код будет работать в Root / .htaccess. Обязательно измените RewriteBase, если хотите поместить его в файл htaccess в подкаталоге.

Редактировать :

В apache 2.4 и новее вы также можете использовать флаг END, чтобы предотвратить ошибку бесконечного цикла. Следующий пример работает так же, как и предыдущий для apache 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]
Амит Верма
источник
10
Привет, спасибо за это. Я пробовал много решений для вырезания .php, но только это сработало правильно :)
Beamkiller 06
4
Спасибо! Это правка - это то место, где его at, apache 2.4, apache 2.5 попадают в бесконечный цикл (и будет 500). [КОНЕЦ] очень важно
Джейк Болам
23

У меня отлично работает следующий код:

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
user1079877
источник
Это работает, за исключением того, что example.com превращается в индекс всех файлов и каталогов. (Apache 2.4)
earth2jason
10

После изменения параметра AllowOverrideс Noneна Allв /etc/apache2/apache2.conf(Debian 8), после этого файл .htaccess просто должен содержать:

Options +MultiViews
AddHandler php5-script php
AddType text/html php

И достаточно было скрыть расширение .php от файлов

Родни Сальседо
источник
Желаю, чтобы этот был выше. Зачем беспокоиться о накладных расходах на перезапись URL-адресов, когда MultiViewsэто делается из коробки
Фил
Это круто. Есть недостатки?
изменено
@reformed Спасибо. Мне пришлось изменить ссылки со <a href="somepage.php">ссылки </a>на <a href="somepage">ссылку </a>в исходном коде
Родни Сальседо
8

Попробуйте это
Следующий код определенно будет работать

RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Самарт Саксена
источник
5

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

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Это все, что есть в моем htaccess, а example.com/page показывает example.com/page.php

Джон
источник
4

Чтобы удалить расширение .php из файла PHP, например yoursite.com/about.php на yoursite.com/about, выполните следующие действия. Откройте файл .htaccess (создайте новый, если он не существует) из корня вашего веб-сайта и добавьте следующий код.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

Чтобы удалить расширение .html из файла html, например yoursite.com/about.html в yoursite.com/about, выполните следующие действия.

Откройте файл .htaccess (создайте новый, если он не существует) из корня вашего веб-сайта и добавьте следующий код.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Ссылка: Как удалить расширение php из URL

Санджив Кумар
источник
1
Единственный ответ, который мне нужен. Спасибо! :)
MatrixCow08 02
2

Если вы кодируете PHP и хотите удалить .php, чтобы у вас был URL-адрес, например:

http://yourdomain.com/blah -> который указывает на /blah.php

Это все, что вам нужно:

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Джефф Хейс
источник
2

Я нашел для себя 100% рабочий Концепт:

# Options is required by Many Hosting
Options +MultiViews

RewriteEngine on

# For .php & .html URL's:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^([^\.]+)$ $1.html [NC,L]

Используйте этот код в корне файла .htaccess вашего сайта, например:

офлайн - wamp \ www \ YourWebDir

онлайн - public_html /

Если это не сработает, измените настройки вашего сервера Wamp: 1) Щелкните левой кнопкой мыши значок WAMP 2) Apache 3) Модули Apache 4) Щелкните левой кнопкой мыши rewrite_module

Иршад Хан
источник
Вы не можете иметь два RewriteRuleтега Lрядом друг с другом. [L]сообщает, mod_rewriteчто это последнее правило для указанного RewriteCond.
MD XF
2

Вот код, который я использовал, чтобы скрыть .phpрасширение от имени файла:

## hide .php extension
# To redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)\.php [NC]
RewriteRule ^ %1 [R=301,L,NC]

Примечание: R=301предназначен для постоянного перенаправления и рекомендуется для использования в целях SEO. Однако, если вам нужно временное перенаправление, замените его простоR

Рахул Гупта
источник
2

У меня получился следующий рабочий код:

RewriteEngine on 
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]
Надим
источник
1

Если ваш URL-адрес в PHP похож на http://yourdomain.com/demo.php, чем на http://yourdomain.com/demo

Это все, что вам нужно:

создать файл .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteRule ^([^\.]+)$ $1.html [NC,L]
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Камлеш
источник
Он работал, http://example.com/myfile но не работал http://example.com/myfolder/(индексный файл). Вы можете помочь мне заставить его работать с индексным файлом?
Уэсли Гонсалвеш
Я думаю , вы должны попробовать выше @starkeen ответ URL: stackoverflow.com/a/30566026/3786343
Kamlesh
1

Пытаться

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule ^(.*)$ $1.php [L] 
Индерджит
источник