Видаліть .php розширення за допомогою .htaccess


101

Так, я читав посібник Apache і шукав тут. Я чомусь просто не можу змусити це працювати. Найближче до мене це видалення розширення, але воно вказує на кореневу директорію. Я хочу, щоб це просто працювало в каталозі, який містить .htaccessфайл.

Мені потрібно зробити три речі з .htaccessфайлом.

  1. Мені це потрібно, щоб видалити .php

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

    б. У мене є одна сторінка , яка використовує ідентифікатор сеансу , приєднаний до URL , щоб переконатися , що ви прийшли в потрібне місце, www.domain.com/download-software.php?abcdefg.

Чи можливо це? Також, чи потрібно мені видалити ".php" із посилань у головному заголовку nav, включаючи файл? ПовиненIE "<a href="support.php">support</a>" be <a href="support">support</a>?

  1. Я хотів би, щоб він змушував "www" перед кожною URL-адресою, так що це не так domain.com, але www.domain.com/page.
  2. Я хотів би видалити всі косої косої риски зі сторінок.

Я буду продовжувати шукати, намагатися і т. Д. Чи потрапляння в підкаталог спричинить якісь проблеми?



Мені просто цікаво, яка це користь? Це так, що ваші користувачі не знають, до якого файлу на вашому сервері вони мають доступ?
Калонь Колоб

два рази. тому вони не знають, які типи файлів ми обслуговуємо, і це виглядає чистіше IMO
Dirty Bird Design

Інший пов'язаний з цим питання: stackoverflow.com/questions/6534904 / ... .
Едвард

Відповіді:


121

Відповідь Gumbo на запитання про переповнення стека Як приховати розширення .html за допомогою Apache mod_rewrite має добре працювати.

Re 1) Змініть .html на .php

Re a.) Так, це можливо, просто додайте #tabдо URL-адреси.

Re b.) Це можливо, використовуючи QSA(Додаток до рядка запитів), див. Нижче.

Це також має працювати в шляху до підкаталогу:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

THX для вашої допомоги, з будь-якої причини, я ставлю ставку через те, що доданий сеанс URL-код із жорстким кодом у файлі PHP (довга історія) Я можу отримати доступ до нього без вищезазначеного. Я дуже вдячний за вашу допомогу, цей матеріал .htaccess для мене складний.
дизайн брудних птахів

8
@Pekka 웃 видаліть простір між [L,пробілами QSA], інакше виникне 500 внутрішніх помилок сервера .
Рахіль Вазір

це зробить так /index/bla/blaсамо, якindex.php
elkebirmed

чомусь цей блок блокує мій CSS для завантаження: /
TheCrazyProfessor

! значить ні. Це правило говорить лише переписати, щоб додати .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

Посібник з перезапису містить інструкції до цього в прикладі Canonical Hostname .

Видаліть задні косої частини (частина 1)

Я хотів би видалити всі косої косої риски зі сторінок

Я не впевнений, чому ви хотіли б це зробити, оскільки керівництво по переписуванню містить приклад з точністю до навпаки . Документи припускають, що видалення останньої косої риски має великий потенціал для виникнення проблем:

Проблема останньої косої риски

Опис:

Кожен веб-майстер може заспівати пісню про проблему останньої косої риски в URL-адресах, що посилаються на каталоги. Якщо вони відсутні, сервер скидає помилку, тому що якщо ви скажете /~quux/fooзамість /~quux/foo/ цього, сервер шукає файл з ім'ям foo. А тому, що цей файл - це каталог, він скаржиться. Насправді він намагається виправити це сам у більшості випадків, але іноді цей механізм потрібно наслідувати вам. Наприклад, після того, як ви зробили багато складних перезаписів URL-адрес у сценарії CGI тощо.

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

Видалити .phpрозширення

Мені це потрібно, щоб видалити .php

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

Видаліть задні косої риски

Деякі пошуки apache remove trailing slashesпривели мене до деяких сторінок оптимізації пошукових систем. Мабуть, деякі системи управління контентом (в цьому випадку Drupal) дозволять зробити вміст доступним і без кінцевої косої риски в URls, що в світі SEO призведе до того, що ваш веб-сайт зазнає дублюючого покарання за вміст. Джерело

Рішення здається досить тривіальним, використовуючи mod_rewriteми переписуємо за умови, що запитуваний ресурс закінчується на a, /і переписуємо 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., ні .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?
nicorellius

@nicorellius вважає, що ти прав. Я оновив свою первісну відповідь вашим спостереженням.
Тім Білава

Треба сказати, що це не завжди працює. Спробуйте відповідь нижче (користувача 1079877)
DonJoe

Ви справжній 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 у підкаталозі.

Редагувати:

На апаш 2.4 та пізніших версіях ви також можете використовувати прапор END, щоб запобігти нескінченній помилці циклу. Наступний приклад працює аналогічно наведеному на апаш 2.4,

RewriteEngine on

RewriteRule ^(.+)\.php$ /$1 [R,L]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*?)/?$ /$1.php [NC,END]

10
Привіт, спасибі за це. Я спробував багато рішень для скорочення .php, але тільки це спрацювало правильно :)
beamkiller

4
Дякую! Це редагування там, де його в, apache 2.4, apache 2.5 опиняється в нескінченному циклі (і буде 500) [END] надзвичайно важливо
Джейк Болам

23

Наступний код добре працює для мене:

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

Це працює, за винятком 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, наприклад, vašite.com/about.php до yoursite.com/about Виконайте цей крок. Відкрийте .htaccess (створіть новий, якщо його немає) з кореня вашого веб-сайту та додайте наступний код.

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

Щоб видалити розширення .html з html-файлу, наприклад, tvojeite.com/about.html до yoursite.com/about Виконайте ці кроки.

Відкрийте .htaccess (створіть новий, якщо його немає) з кореня вашого веб-сайту та додайте наступний код.

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

Довідка: Як видалити розширення php з URL


1
Єдина відповідь, яка мені була потрібна. Дякую! :)
MatrixCow08

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) Клацніть лівою кнопкою миші переписати_модуль


Не можна мати два RewriteRules з тегом 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

Якщо вашу адресу в 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] 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.