Переместить RewriteBase из htaccess в конфигурацию сайта не работает - PullRequest
1 голос
/ 04 августа 2020

Это мой оригинальный файл .htaccess. Правило перезаписи работает нормально:

RewriteEngine On
RewriteBase /backenddev/
RewriteRule ^share/([ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz123456789]{8})$ share.php?token=$1

Но после перемещения части RewriteBase в файл конфигурации сайта Apache и перезапуска Apache оно больше не работает.

Новый файл .htaccess только с правилом перезаписи:

RewriteRule ^share/([ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz123456789]{8})$ share.php?token=$1

И Apache файл conf сайта:

  Alias /backenddev "/var/www/backend_dev/"
  <Directory /var/www/backend_dev/>
    Options FollowSymLinks
    RewriteEngine On
    RewriteBase "/backenddev/"
    AllowOverride All
    
    ...
  </Directory>

Когда я открываю URL https://<mysite>/backenddev/share/XV6TqNpE, я получаю 404 и содержание сайта:

The requested URL /var/www/<mysite>/backend_dev/share.php was not found on this server.

Ожидается перенаправление на https://<mysite>/backenddev/share.php?token=XV6TqNpE.

Есть идеи, почему это не работает?

1 Ответ

0 голосов
/ 09 августа 2020

Значение директивы RewriteBase, определенной в родительских конфигурациях, не наследуется дочерними конфигурациями по умолчанию * 1 . Вам нужно явно включить это с помощью опции MergeBase в родительской конфигурации.

Например:

<Directory /var/www/backend_dev/>
  Options FollowSymLinks
  RewriteEngine On
  RewriteBase /backenddev/
  RewriteOptions MergeBase
  AllowOverride All  
  ...
</Directory>

Обратите внимание, что дочерние конфигурации могут переопределить это, установив там собственные RewriteBase .

* 1 Это поведение по умолчанию фактически изменилось в Apache 2.4.4. Между 2.4.0 и 2.4.3 значение RewriteBase, по-видимому, было объединено с дочерними конфигурациями по умолчанию.

Ссылка:

MergeBase С помощью этой опции значение RewriteBase копируется из того места, где оно явно определено, в любой подкаталог или подкаталог, который не определяет его собственный RewriteBase. Это было поведение по умолчанию в версиях с 2.4.0 по 2.4.3, и флаг для его восстановления доступен Apache HTTP Server 2.4.4 и новее.

Обратите внимание, однако, что только этот параметр не включает mod_rewrite наследование . Директивы в дочерних конфигурациях (.htaccess) по-прежнему полностью переопределяют директивы в родительском контейнере <Directory>. Параметр MergeBase относится только к значению RewriteBase.

Помимо:

RewriteRule ^share/([ABCDEFGHIJKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz123456789]{8})$ share.php?token=$1

Это можно «упростить» до:

RewriteRule ^share/([a-np-z1-9]{8})$ share.php?token=$1 [NC]

Поскольку только o, O и 0 опускаются в символе диапазоны .

Флаг NC должен тогда соответствовать соответствующим прописным буквам.

Кроме того, рассмотрите возможность добавления флага L, поскольку у вас есть «другие правила» - и они, вероятно, будут обрабатываться без необходимости (при условии, что конфликта уже нет).

...