2017-02-07 3 views
0

У меня есть сайт под Apache2, который доступен извне и внутренне через разные URL-адреса. Он должен работать как на example.com/, так и на example.com/sites/mysite/. Поэтому я использую относительные адреса в моем HTML, как:Некоторые усовершенствованные функции mod_rewrite от Apache?

../static/css/style.css 
../some_other_page.html 

Для того, чтобы обрабатывать недопустимые запросы на несуществующие страницы (например, example.com/non_existing_page/) Я сделал страницу ошибки (которая также содержит ссылки на другие части сайта) и используется mod_rewrite передать запросы там:

RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f 
RewriteRule .* /custom_404_page/ [PT] 

в результате пользователь видит хорошо настроенную страницу, а адресная строка все еще содержит оригинальный запрос. Это правило также может быть адаптировано в соответствии с базовым URL-адресом. Однако при выполнении недопустимого запроса в подкаталог (например, example.com/non/existing/page/) страница с ошибкой прерывается, так как ссылки являются относительными (например, ../static/css/style.css теперь разрешается до example.com/non/existing/static/css/style.css). Я мог бы исправить эту проблему, используя флаг [R] (redirect) вместо [PT]; однако, адресная строка также читает example.com/custom_404_page/, чего я бы хотел избежать.

Поэтому мне интересно, можно ли сохранить все три функции во время работы под Apache2:

  • Возможности работать на различных базовые адреса
  • Показаны настроенная страница ошибок для недопустимых запросов
  • подпорной оригинальные запросы в адресной строке
+0

вы можете использовать 'FallbackResource' вместо этого, попробуйте. –

ответ

0

Существует способ, который будет работать на большинстве сайтов:

Define MY_ROOT_BASE /sites/mysite/ 
Define MY_ROOT_PAGES "(static|index|some_page|some_another_page)" 

RewriteEngine On 
RewriteCond %{REQUEST_URI} ^${MY_ROOT_BASE}${MY_ROOT_PAGES}/ [NC] 
RewriteRule .* - [L] 
RewriteRule ^${MY_ROOT_BASE}(.*?/)?${MY_ROOT_PAGES}/(.*)$ ${MY_ROOT_BASE}$2/$3 [NC,R,L] 

Это исправит все запросы, содержащие имя одной из корневых страниц, но не в корневой позиции. Например, example.com/sites/mysite/some/rubbish/static/css/style.css станет example.com/sites/mysite/static/css/style.css. Первое правило - защита двигателя от бесконечного цикла.

Обратите внимание, что если запрос содержит имена более одного корня страниц (например, /index/some_another_page/), он будет обрезать непризнанный URL кусок только до первого матча (из-за в структуре не-жадным *?) и направить запрос к соответствующему обработчику (в этом примере к обработчику /index/). Это поведение можно настроить в соответствии с потребностями конкретного веб-сайта.