Удалите расширение .php с помощью .htaccess - PullRequest
87 голосов
/ 26 октября 2010

Да, я прочитал руководство по 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. Я хочу удалить все косые черты со страниц.

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

Ответы [ 13 ]

102 голосов
/ 26 октября 2010

Ответ Гамбо на вопрос переполнения стека Как скрыть расширение .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]
67 голосов
/ 26 октября 2010

Apache mod_rewrite

Вам нужно: mod_rewrite ,

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

Вообще говоря, 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 не загружаться, потому что тамno 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 без расширения apache .

Удалить косую черту

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

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

Вот его пример, который предполагает, что ваш домен - 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 ( MOVED TEMPORARILY ) будут возвращены.

Заключительная записка

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

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

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

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

40 голосов
/ 01 июня 2015

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

Вы также можете попробовать это, чтобы полностью удалить расширения .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]
21 голосов
/ 14 октября 2013

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

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
12 голосов
/ 06 марта 2014

Вот метод, если вы хотите сделать это только для одного конкретного файла:

RewriteRule ^about$ about.php [L]

Ссылка: http://css -tricks.com / snippets / htaccess / удалить файл-расширение-из-URL-адресов /

9 голосов
/ 22 апреля 2016

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

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

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

5 голосов
/ 18 сентября 2013

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

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

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

4 голосов
/ 19 июля 2015

Чтобы удалить расширение .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

2 голосов
/ 22 февраля 2017

Вот код, который я использовал, чтобы скрыть расширение .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 голосов
/ 15 марта 2013

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

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

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

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...