Назад | Перейти на главную страницу

Псевдоним Apache для ссылки на другой DocumentRoot

У меня установлен WordPress в /var/www/wordpress/ и мой собственный код в /var/www/project/

Теперь возникает следующая проблема: когда я пытаюсь получить доступ example.com/client/ или example.com/admin/ он должен ссылаться на /var/www/project/ и выполните оттуда .htaccess + index.php.

Я попытался разместить директиву Alias ​​в конфигурации Apache с частичным успехом.

Alias /admin/ /var/www/project
Alias /client/ /var/www/project

Когда я получаю доступ example.com/client/ он работает нормально, но как только я прошу example.com/client/login это терпит неудачу с File does not exist: /var/www/project/login ошибка.

В .htaccess в /var/www/project выглядит как

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/(.*)$ index.php?module=$1&task=$2 [L,QSA]

Прежде всего: моя любимая мозоль, цитата из руководство по .htaccess файлы:

Вам следует полностью избегать использования файлов .htaccess если у вас есть доступ к файлу конфигурации главного сервера httpd. Использование файлов .htaccess замедляет работу вашего http-сервера Apache. Любую директиву, которую вы можете включить в файл .htaccess, лучше установить в блоке Directory, так как это будет иметь тот же эффект с лучшей производительностью.

Во-вторых: канонический ответ почти на все вопросы о mod_rewrite: Вот

Я не уверен на 100%, но думаю, что установив RewriteBase к / внутреннее перенаправление будет на example.com/index.php, а не на /var/www/project/index.php. Кроме того, я думаю, что PT Флаг необходим для учета соответствия псевдонима.

Вы можете попробовать

Alias /admin/ /var/www/project
Alias /client/ /var/www/project
<Directory /var/www/project>
  RewriteEngine On
  RewriteBase /
  # Do nothing when a file or directory with the requested name exists
  RewriteCond %{REQUEST_FILENAME} -f  [OR]
  RewriteCond %{REQUEST_FILENAME} -d
  RewriteRule ^.* - [L]

  # Use the request URL to select the correct module and task
  RewriteRule ^/([^/]+)/(.*)$ /$1/index.php?module=$1&task=$2 [PT,L,QSA]
</Directory>

В документация для Alias показывает, что это ожидаемое поведение. Псевдоним добавляет любые конечные пути после пути с псевдонимом.

Я думаю, что вы хотите выбросить дополнительную информацию о пути в псевдониме с помощью

AliasMatch /(admin|client)/.* /var/www/project

Это должно отправить запрос в / var / www / project, оставив при этом URL-путь исходного запроса нетронутым для обработки RewriteRule.