Принудительное переписывание URL-адресов путем скрытия расширений .php AND .htm (l) и перенаправления на URL-адреса без расширений. - PullRequest
0 голосов
/ 06 февраля 2012

вот моя конфигурация:

  • http://domain.com (очевидно, вымышленное имя ...), размещенное на сервере под управлением Apache с включенным mod_rewrite
  • папка с именем "foo": (расположена в http://domain.com/foo/ и в которую я хочу поместить мой файл .htaccess), содержащая только 3 типа файлов .php, .htm, .html * * 1010
  • .php файлы (в качестве примера я буду ссылаться на один из них: phpfile.php)
  • .htm файлы (для примера приведу один из них: htmfile.htm)
  • .html файлов (в качестве примера я буду ссылаться на один из них: htmlfile.html)
в папке foo ни один файл не имеет эквивалента с другим расширением или без расширения (т.е., например, ни phpfile.htm, ни phpfile.html, ни phpfile не существует в foo, существует только php.file.php)

Вот что я пытаюсь достичь:

Я старался изо всех сил, и софар я пришел с этим содержимым для моего файла .htaccess (находится в папке "foo"), который, к сожалению, работает только в последнем из двух случаев, в которых Я заинтересован (т.е. обслуживаю phpfile.php, когда я запрашиваю phpfile), обслуживаю htmfile.htm, когда запрашиваю htmfile, или обслуживаю htmlfile.html, когда я запрашиваю htmlfile), и который игнорирует 301 перенаправление:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /foo

# Redirect permanently the requests for existing .php files
# to extensionless files (non present on the server)
# so that phpfile.php gets redirected to phpfile
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} \.php$
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule (.*)\.php$ $1   [R=301,NC]

# Redirect permanently the requests for existing .htm(l) files
# to extensionless files (non present on the server)
# so that htmfile.htm gets redirected to htmfile
# so that htmlfile.html gets redirected to htmlfile
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} \.html?$
RewriteCond %{REQUEST_FILENAME}\.html? -f   
RewriteRule (.*)\.html?$ $1 [R=301,NC]

# Matching requests for non existing extensionless files
# with their existing equivalent on the server
# so that domain.com/foo/phpfile will display
# the contents of domain.com/foo/phpfile.php,
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule (.*)$ $1.php    [L]

# so that domain.com/foo/htmlfile will display
# the contents of domain.com/foo/htmlfile.html,
RewriteCond %{REQUEST_FILENAME}\.html -f    
RewriteRule (.*)$ $1.html   [L]

# so that domain.com/foo/htmfile will display
# the contents of domain.com/foo/htmfile.htm,
RewriteCond %{REQUEST_FILENAME}\.htm -f 
RewriteRule (.*)$ $1.htm    [L]

Заранее благодарю за любую помощь / совет.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

В первых двух правилах есть логический недостаток в том, что существует файл php или html.Проверка URI также фактически является дубликатом шаблона правила перезаписи, а! F подразумевает! -D.Вы также можете сложить их в одно правило:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC]

Последние два в порядке, но я бы поменял порядок, если запросы html встречаются чаще, чем php

Почему MultiViews не делаетt help

Options +MultiViews реализует концепцию, известную как согласование содержимого , и при этом Apache вызывает подзапрос для анализа корневого имени файла.Он сканирует каталог на наличие известных комбинаций filename.extension, поэтому в этом случае, если существует xxx.php, а ваш запрос на xxx, он заменит xxx.php и сделаетвнутреннее перенаправление, которое затем вызывает срабатывание вашего первого правила, удаляя расширение .php , и это вызывает ошибку, которую вы видите.

Итак, (i) вам нужно отключить множественные просмотры и (ii) подзапросы;(iii) обнаружение и предотвращение повторных петель.Это одно решение, которое будет делать то, что вы хотите:

Options +FollowSymLinks  -MultiViews
RewriteEngine on
RewriteBase /foo

RewriteCond %{ENV:REDIRECT_END}  =1
RewriteRule ^ - [L,NS]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC,NS]

RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)$ $1.html   [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.htm -f
RewriteRule (.*)$ $1.htm    [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)$ $1.php    [L,E=END:1,NS]
0 голосов
/ 22 ноября 2013

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

Options +FollowSymLinks  -MultiViews
RewriteEngine on
RewriteBase /

RewriteCond %{ENV:REDIRECT_END}  =1
RewriteRule ^ - [L,NS]

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*?)\.(php|html?)$        $1   [R=301,NC,NS]

RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule (.*)$ $1.html   [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.htm -f
RewriteRule (.*)$ $1.htm    [L,E=END:1,NS]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule (.*)$ $1.php    [L,E=END:1,NS]

Эта версия работает для меня.

Спасибо.

Ура!

...