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

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

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

  • Мне нужно, чтобы удалить .php

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

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

Возможно ли это? Кроме того, при этом мне нужно удалить ".php" из ссылок в моем файле заголовка nav include? Если IE "<a href="support.php">support</a>" be <a href="support">support</a>?

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

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

Ответы

Ответ 1

Ответ 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]

Ответ 2

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

Руководство по перезаписи содержит инструкции для этого в примере Canonical Hostname.

Снять косые черты (часть 1)

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

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

Проблема с последующим слэш

Описание:

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

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

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

Мне нужно, чтобы удалить .php

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

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

# 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 будут работать снова.

Я должен отдать должное, когда кредит должен быть получен для этого решения, поскольку я нашел его Michael J. Radwins Blog, выполнив поиск в Google для php без расширения apache.

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

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

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

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

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

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

Обязательный www., no .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, вы можете заставить сервер автоматически удалять любые конечные косые черты.

Ответ 3

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

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

Ответ 4

Следующий код отлично подходит для меня:

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

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

<IfModule mod_rewrite.c>
    RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

Если ваш 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]

Ответ 11

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

Ответ 12

Я нашел 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, например:

offline - wamp\www\YourWebDir

онлайн - public_html/

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