Трейлинг sla sh против трейла sla sh NO REDIRECT - PullRequest
1 голос
/ 05 февраля 2020

Я должен быть в состоянии направить запрос GET или POST, когда он приходит к

/eSCL/ScannerStatus

или

/eSCL/ScannerStatus/

TO

/eSCL/ScannerStatus/index.php

I Я не ищу перенаправления, поскольку это то, что я получаю сейчас. (301 постоянно перемещено)

То есть, если конечный sla sh или нет, запрос ссылается на каталог, и мне нужно загрузить индекс. php в этом каталоге без перенаправления

Я просмотрел документы здесь https://httpd.apache.org/docs/2.4/mod/mod_dir.html и, откровенно говоря, похоже, что он не работает, как указано, или, может быть, мне не хватает мода?

Я пробовал много вариантов.

Я выполнил

sudo a2enmod rewrite

и

sudo a2enmod dir

, теперь оба отображаются как включенные.

Apache 2.4, работающие на Raspberry Pi3

Я пробовал МНОГИЕ МНОГИЕ разные правила, и я также вижу в результатах Google, что это проблема для многих других, пытающихся сделать то же самое. Я вижу многочисленные "решения", опубликованные, многие из которых не работают.

Я не вижу причин для повторного повторения попыток переписывания 20+ модов, которые я предпринял и потерпел неудачу. Я ищу то, что работает без перенаправления

Edit-UPDATE -------------------------------- -----------------

Я только что вернулся к этому, удалил .htaccess, и теперь сервер отказывается загружать index.php и вместо этого показывает список каталогов .

Это ставит меня в недоумение. Я не верю, что мне нужно .htaccess для PHP файлов, как этого не было раньше.

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ 2 -------------------- ---------------- Мне удалось вернуться на правильный путь с некоторыми директивами, которые по некоторым причинам казались go.

Теперь у меня есть / var / www/html/.htaccess

DirectorySlash Off

RewriteEngine On

RewriteRule ^eSCL/ScannerStatus/?$ eSCL/ScannerStatus/index.php [L]

RewriteRule ^eSCL/ScannerCapabilities/?$ eSCL/ScannerCapabilities/index.php [L]

RewriteRule ^eSCL/ScanJobs/?$ eSCL/ScanJobs/index.php [L]

RewriteRule ^eSCL/Scans/?$ eSCL/Scans/index.php [L]

в глобальном разделе apache2.conf, который у меня есть (это, очевидно, то, что я должен был сделать, чтобы получить индексные файлы. php для загрузки по умолчанию снова):

<Directory "/var/www/html">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/scans/*">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/eSCL/ScannerStatus">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/eSCL/ScannerCapabilities">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/eSCL/ScanJobs">
DirectoryIndex  index.php index.htm
</Directory>

Вот что захватывает wireshark при запросе http://192.168.1.50/eSCL/ScannerStatus (без трейлинг-листа sh)

HTTP/1.1 301 Moved Permanently
Date: Thu, 06 Feb 2020 16:56:00 GMT
Server: Apache/2.4.25 (Raspbian)
Location: http://192.168.1.50/eSCL/ScannerStatus/
Content-Length: 327
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a 
href="http://192.168.1.50/eSCL/ScannerStatus/">here</a>.</p>
<hr>
<address>Apache/2.4.25 (Raspbian) Server at 192.168.1.50 Port 80</address>

Я также специально исключил файлы с поддержкой сайтов в apache2.conf с

# Include the virtual host configurations:
# IncludeOptional sites-enabled/*.conf

Я также проверил:

pi@raspberrypi:/etc/apache2 $ sudo a2enmod rewrite
Module rewrite already enabled
pi@raspberrypi:/etc/apache2 $ sudo a2enmod dir
Module dir already enabled

1 Ответ

0 голосов
/ 05 февраля 2020
/eSCL/ScannerStatus

Если ScannerStatus является физическим каталогом, то по умолчанию mod_dir добавит sla sh с перенаправлением 301, чтобы "исправить" URL.

Вам необходимо переопределить этот поведение и установить DirectorySlash Off. Затем вам нужно будет внутренне переписать запрос, используя mod_rewrite для нужного index.php документа (вместо того, чтобы полагаться на DirectoryIndex, как обычно).

Например, в вашем root .htaccess file:

DirectorySlash Off

RewriteEngine On

RewriteRule ^eSCL/ScannerStatus/?$ eSCL/SCannerStatus/index.php [L]

Обратите внимание, что вам нужно очистить кеш браузера, так как перенаправление 301 для добавления sla sh (mod_dir), скорее всего, будет кэшировано браузером. .

Я не верю, что мне нужно .htaccess для PHP файлов, как этого не было раньше.

Вам нужно .htaccess, если вы хотите переопределить поведение сервера по умолчанию и использование физических каталогов без косой черты.


ОБНОВЛЕНИЕ:

<Directory "/var/www/html">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/scans/*">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/eSCL/ScannerStatus">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/eSCL/ScannerCapabilities">
DirectoryIndex  index.php index.htm
</Directory>

<Directory "/var/www/html/eSCL/ScanJobs">
DirectoryIndex  index.php index.htm
</Directory>

Контейнер <Directory> применяется к указанный каталог и все подкаталоги. Таким образом, в приведенном выше примере все, кроме первого <Directory "/var/www/html"> контейнера, не требуются.

Однако здесь нет ничего, что позволяло бы переопределять .htaccess? И поведение, которое вы видите в настоящее время, может показаться, что файлы .htaccess не включены - поскольку директивы .htaccess, похоже, не выполняют что-либо .

ТЕСТ: Добавьте любую "ерунду" в начало файла .htaccess. Если .htaccess файлы обрабатываются, то это ужасно сломается и приведет к 500 Internal Server Error. Если ошибки нет, то файл .htaccess игнорируется (файлы ie. .htaccess не включены).

Перезапись , которую мы добавили в .htaccess для маршрутизации запросов к index.php отменяет необходимость в DirectoryIndex - но это не повредит.

Чтобы включить переопределения .htaccess, вам нужно установить AllowOverride в соответствующем контейнере <Directory>. Например:

<Directory "/var/www/html">
# Allow .htaccess files to override config directives
AllowOverride All

# Allow mod_dir to issue an internal subrequest for the DirectoryIndex
# when requesting /subdirectory/ (note the trailing slash)
DirectoryIndex  index.php index.htm

# Access needs to be permitted (somewhere)
Require all granted
</Directory>

Если у вас есть доступ к конфигурации сервера, вам не нужно .htaccess. Все директивы в .htaccess (каталог context context) могут go непосредственно в соответствующем контейнере <Directory>. (Хотя требования к разработке / распространению могут упростить использование файлов .htaccess.)

Кстати, директива DirectoryIndex может использоваться в .htaccess.


В сторону:

Как отмечалось ранее, приведенная выше перезапись в .htaccess сводит на нет необходимость в DirectoryIndex index.php. Тем не менее, они могут быть изменены немного , чтобы использовать это. Например (упражнение Academi c):

DirectoryIndex index.php
DirectorySlash Off

RewriteEngine On

# Note the different regex having removed "/?"
RewriteRule ^eSCL/ScannerStatus$ eSCL/SCannerStatus/index.php [L]

Теперь запрос на /eSCL/ScannerStatus (без трейлингера sh) переписывается с помощью mod_rewrite на index.php. Но запрос на /eSCL/ScannerStatus/ (с конечным sla * sh) теперь обрабатывается DirectoryIndex, который возвращает index.php через внутренний подзапрос. В более раннем RewriteRule оба этих запроса были обработаны mod_rewrite.

Обратите внимание, что 4 правила для 4 различных подкаталогов потенциально могут быть объединены в одно правило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...