Как перенаправить все мои URL-адреса без расширения до .php - PullRequest
2 голосов
/ 07 июля 2011

Первоначально я хотел, чтобы все мои URL заканчивались без расширения.К сожалению, я перепробовал много кодов htaccess и уже почти сдался.

Так что теперь я хочу сделать так, чтобы человек захотел посетить страницу на моем сайте, но забыл ввести .phpОн / она будет автоматически перенаправлен на тот же URL, но с .php

Как это можно сделать?Спасибо!

Ответы [ 4 ]

4 голосов
/ 07 июля 2011

Вот правила:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)$ $1.php [L,QSA]
  1. Он проверит, не является ли запрошенный ресурс существующей папкой.Например: вы запрашиваете http://www.example.com/help.Если такая папка присутствует (/help), правило ничего не будет делать (приоритет отдается папке). Если вам не нужно это поведение, удалите первую строку.

  2. Перед проверкой будет проверен, есть ли такой файл .php.Например: вы запрашиваете http://www.example.com/aboutus, но там нет файла NO aboutus.php - перезапись не происходит.

  3. Все такие запросы должны выполняться без завершающей косой черты: должно быть http://www.example.com/aboutusи НЕ http://www.example.com/aboutus/

  4. Правило будет работать и для URL в подпапках: например, http://www.example.com/pages/help/aboutus будет переписано очень хорошо.

  5. Из-за вышеупомянутых проверок правило не будет входить в цикл перезаписи (ошибка 500 для этого правила)

  6. Строка запроса (параметры страницы) будет сохранена

3 голосов
/ 11 июня 2013
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

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

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [L]
1 голос
/ 13 октября 2014

В ответ на Sun Love код, который вы опубликовали, работает хорошо, за исключением ситуаций, когда у вас есть косая черта без расширения файла (я получаю ошибку 500), потому что первый RegEx не подходит для этой ситуации.

example.com / test.html - работает (перенаправляет на / test)

example.com / test - работает (без перенаправления)

example.com /test.html - работает (перенаправляет на / test)

example.com / test / - не работает (ошибка 500)

Возможно, существует лучший способсделать это, но я добавил еще одно условие переписывания, чтобы исправить это:

RewriteEngine on
Options +FollowSymLinks -MultiViews
RewriteBase /

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

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s([^.]+)/\s
RewriteRule ^ %1 [R=301,L]

## To internally redirect /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [L]
0 голосов
/ 07 июля 2011

Попробуйте это .htaccess:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /

RewriteRule ^([^\.]+)$ $1.php [L]

РЕДАКТИРОВАТЬ: ^([^\.]+)$ $1.php [L]

...