.htaccess переписать файл uri в файл file-name.html или file-name.php - в зависимости от того, что существует - PullRequest
0 голосов
/ 27 июля 2011

ЦЕЛЬ: Чтобы браузер переписал файл file-name.php, если он существует;иначе возвращаем file-name.html - набрал ли посетитель URL как один из следующих:

  1. http://mydomain.com/file-name
  2. http://mydomain.com/file-name.html
  3. http://mydomain.com/file-name.php

В моем файле с расширением .htaccess в корне были успешно выполнены следующие правила:

# REWRITE FILE URI TO file.php IF EXISTS
Options Indexes +FollowSymLinks +MultiViews
Options +ExecCGI
RewriteEngine on
RewriteBase /
# parse out basename, but remember the fact
RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes]
# rewrite to document.php if exists
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [S=1]
# else reverse the previous basename cutout
RewriteCond %{ENV:WasHTML} ^yes$
RewriteRule ^(.*)$ $1.html

Однако с тех пор я установил WP в корне вместе с уже существующим веб-сайтоми эти правила больше не работают.

ЧТО РАБОТАЕТ: file-name перезаписывается в file-name.html или file-name.php - в зависимости от того, какой файл существует.

ЧТО НЕ РАБОТАЕТ: file-name.html не переписывается в file-name.php, даже если нет file-name.html и file-name.php есть.Кроме того, file-name.php не переписывается в file-name.html, когда нет file-name.php, но есть file-name.html.

Весь .htaccess, как он есть сейчас:

# BEGIN WP MULTISITE RULES
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]

# uploaded files
RewriteRule ^([_0-9a-zA-Z-]+/)?files/(.+) wp-includes/ms-files.php?file=$2 [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule  ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
RewriteRule  ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
# END WP MULTISITE RULES

# REWRITE FILE URI TO file.php IF EXISTS
Options Indexes +FollowSymLinks +MultiViews
Options +ExecCGI
RewriteEngine on
RewriteBase /
# parse out basename, but remember the fact
RewriteRule ^(.*).html$ $1 [C,E=WasHTML:yes]
# rewrite to document.phtml if exists
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [S=1]
# else reverse the previous basename cutout
RewriteCond %{ENV:WasHTML} ^yes$
RewriteRule ^(.*)$ $1.html

Любые советы?

1 Ответ

0 голосов
/ 27 июля 2011

Краткий обзор говорит о том, что ваши исходные правила, скорее всего, никогда не будут достигнуты, поскольку правила WP должны перехватывать все запросы.

Эта строка RewriteRule ^ - [L] с этими условиями прервет перезапись для любых уже существующих файлов или папок, а эта строка RewriteRule . index.php [L] будет перехватывать / перенаправлять все запросы на index.php.

Если вы перенесете свои правила выше, чем WordPress, он снова заработает.


Чтобы переписать запрос несуществующего файла .php в файл .html, используйте это правило:

# rewrite non-existing .php file to existing .html
RewriteCond %{DOCUMENT_ROOT}/$1.php !-f
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule ^(.+)\.php$ $1.html [L,PT]

Поместите его под ваши правила (но выше WP). Правило проверит, не существуют ли файлы .php, и перезапись произойдет только при наличии файла .html. Если оба файла недоступны, то ничего не произойдет.

Имейте в виду, что из-за этих проверок и того факта, что правило находится в верхней части цепочки перезаписи, это правило будет оцениваться для каждого запроса в файл .php (даже на страницы WP), что может оказать дополнительное давление на очень загруженный сервер , В идеале вы хотели бы иметь правильные URL в первую очередь, чтобы не было необходимости в таких манипуляциях.

...