Apache vhost: Alias ​​и RewriteRule - PullRequest
       28

Apache vhost: Alias ​​и RewriteRule

0 голосов
/ 25 апреля 2018

У меня есть один URL (домен), для нескольких каталогов (проект).И у меня очень странное поведение при добавлении в него .htaccess.

  • sub.mywebsite.com/ => /foo/bar/things
  • sub/mywesite.com/pro => /srv/www/new

VirtualHost:

<VirtualHost *:80>
    DocumentRoot /foo/bar/things
    ServerName sub.mywebsite.com
    Alias /pro /srv/www/new
</VirtualHost>

И это работает отлично.Когда я продолжаю sub.mywebsite.com/, он попадает в /foo/bar/things dir и наоборот.


Теперь давайте добавим простой .htaccess в /srv/www/new:

RewriteEngine on
RewriteRule ^(.*)/$    php/file.php?text=$1   [L,QSA]

Поэтому, когда я продолжаю sub.mywebsite.com/pro/hello/, файл, который называется, должен быть /srv/www/new/php/file.php с аргументом GET.Я дважды проверил, правило хорошее.

Вот конец RewriteLogLevel 4:

192.168.123.123 - - [25/Apr/2018:19:28:11 +0200] [sub.mywebsite.com/sid#7f317dd08b8][rid#7f37eca9f78/initial] (1) 
[perdir /srv/www/new/] internal redirect with /srv/www/new/php/file.php [INTERNAL REDIRECT]

И онлайн-проверка htaccess подтвердите это: The new url is http://sub.mywebsite.com/php/file.php%3Ftext=testing

Но я 'у нас есть Apache 404 не найден:

Not Found
The requested URL /srv/www/new/php/file.php was not found on this server.

И да, ls -l /srv/www/new/php/file.php файл существует.

ОЧЕНЬ ОДД часть такова: в журнале ошибок Apache, я получил:

[Wed Apr 25 19:45:30 2018] [error] [client 192.168.123.123] File does not exist: /foo/bar/things/srv

Вопросы :

  1. Какого черта это?Почему файл в error_log отличается от файла, отображаемого в моем браузере?
  2. Почему apache не может загрузить нужный файл /srv/www/new/php/file.php, если его спросить .htaccess?

Не стесняйтесь спрашивать у меня больше данных, если это необходимо.Я хочу понять!

Примечание: в /foo/bar/things нет .htaccess;Я много чего перепробовал в своем vhost, например добавив <directory> и т. Д.

1 Ответ

0 голосов
/ 26 апреля 2018

Ответ на оба ваших вопроса уже показан на вашем экране и в ваших журналах:

The requested URL /srv/www/new/php/file.php was not found on this server.

Запрошенный URL .

AH00128: File does not exist: /foo/bar/things/srv/www/new/php/file.php

Файл не существует.

Итак, apache не пытается получить файл file.php, который находится в папке /srv/www/new/php/ вашей файловой системы.Он пытается открыть URL http://sub.mywebsite.com/srv/www/new/php/file.php, который объясняет как ошибку браузера, так и строку в вашем журнале ошибок, поскольку для этого URL он действительно должен искать в /foo/bar/things/srv/www/new/php/file.php.

From http://httpd.apache.org/docs/current/mod/mod_rewrite.html:

Механизм перезаписи может использоваться в файлах .htaccess и в разделах с некоторой дополнительной сложностью.
(...)
См. Директиву RewriteBase для получения дополнительной информации относительнокакой префикс будет добавлен обратно к относительным заменам.
(...)
Директива RewriteBase указывает префикс URL-адреса, который будет использоваться для директив RewriteRule для каждого каталога (htaccess), которые заменяют относительный путь.Эта директива обязательна при использовании относительного пути в подстановке в контексте каталога (htaccess).
(...)
Эта неправильная конфигурация обычно приводит к тому, что сервер ищетпод корневым каталогом документа.

Решение: добавьте RewriteBase "/pro" к вашему .htaccess

Вы можете увидеть разницу в журнале перезаписи:

Без RewriteBase:

[perdir /srv/www/new/] rewrite 'hello/' -> 'php/file.php?text=hello'
[perdir /srv/www/new/] add per-dir prefix: php/file.php -> /srv/www/new/php/file.php
[perdir /srv/www/new/] internal redirect with /srv/www/new/php/file.php [INTERNAL REDIRECT]

С RewriteBase "/pro":

[perdir /srv/www/new/] rewrite 'hello/' -> 'php/file.php?text=hello'
[perdir /srv/www/new/] add per-dir prefix: php/file.php -> /srv/www/new/php/file.php
[perdir /srv/www/new/] trying to replace prefix /srv/www/new/ with /pro
strip matching prefix: /srv/www/new/php/file.php -> php/file.php
add subst prefix: php/file.php -> /pro/php/file.php
[perdir /srv/www/new/] internal redirect with /pro/php/file.php [INTERNAL REDIRECT]
...