URL-адрес Apache 2.4 переписан: /server/?Server=ServerName в /server/ServerName

Я пытаюсь просто переписать URL-адрес на /server/ServerName из /server/?Server=ServerName, чтобы параметр ServerName передавался в PHP.

В настоящее время у меня есть это в моем файле .htaccess:

RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} Server=([^&]+)
RewriteRule "^server/$" "/server/%1/?"

При попытке просмотреть оба /server/ServerName или /server/?Server=ServerName я получаю ошибку 404.

Вот мой журнал перезаписи:

init rewrite engine with requested uri /server/
pass through /server/
strip per-dir prefix: C:/wamp64/www/server/ -> server/
applying pattern '^server/$' to uri 'server/'
RewriteCond: input='Server=ServerName' pattern='Server=([^&]+)' => matched
rewrite 'server/' -> '/server/ServerName/?'
split uri=/server/ServerName/? -> uri=/server/ServerName/, args=<none>
trying to replace prefix C:/wamp64/www/ with /
trying to replace context docroot C:/wamp64/www with context prefix 
internal redirect with /server/ServerName/ [INTERNAL REDIRECT]

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

Я пробовал настройки из:

Я также занимался переписыванием кода, пытаясь увидеть, действительно ли он был переписан.

Использование приведенного ниже кода успешно перезаписывает каталог /test2/ в /server/?Server=ServerName, и страница загружается нормально, поэтому я знаю, что модуль активен и работает.

RewriteRule ^test2/$ /server/?Server=ServerName [PT,L,R=301]

Попытка этого изменения не удалась. URL не перезаписывается, но страница загружается. Apache 2.4 .htaccess дружественный URL переписан

RewriteRule ^server/([^/\.]+)/?$ /server/?Server=$1? [L]

«переписать URL-адрес на /server/ServerName from /server/?Server=ServerName» — переписывать так не имеет смысла (должно быть наоборот) — что может быть тем, где вы не застреваете. Однако /server/?Server=ServerName также не является допустимой конечной точкой... Я предполагаю, что /server/ - это каталог (каталоги не принимают запросы) - какой файл фактически обрабатывает запрос? На какой URL вы ссылаетесь?

MrWhite 30.04.2023 23:29

@MrWhite Спасибо за ответ. /server/ — это каталог. Index.php — это файл в каталоге, который он будет использовать. Я пытаюсь получить localhost/server/ServerName вместо localhost/server/?Server=ServerName или localhost/server/index.php?Server=ServerName

Codewow 01.05.2023 00:12

Почему вы пытаетесь поместить имя сервера в параметр URL, чтобы сделать его доступным для PHP, когда он уже доступен с помощью $_SERVER['SERVER_NAME']?

Stephen Ostermiller on Strike 01.05.2023 10:59
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
3
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

перепишите URL-адрес на /server/ServerName из /server/?Server=ServerName:

RewriteCond %{QUERY_STRING} Server=([^&]+)
RewriteRule "^server/$" "/server/%1/?"

У вас, кажется, это неправильно. Вы должны ссылаться на /server/ServerName в исходном коде HTML и, следовательно, внутренне переписывать запрос с /server/ServerName на /server/index.php?Server=ServerName (обратите внимание на добавление index.php, как указано в комментариях). /server/index.php?Server=ServerName — это базовый (скрытый) путь к файлу, который фактически обрабатывает запрос.

Хотя в последней строчке вроде все верно...

URL не перезаписывается, но страница загружается.

RewriteRule ^server/([^/\.]+)/?$ /server/?Server=$1? [L]

URL-адрес должен быть перезаписан, иначе страница не загрузится. Может возникнуть некоторая путаница в отношении того, что такое «переписать». Это не меняет URL-адрес. Вы не используете .htaccess для изменения URL-адреса. Вы должны изменить URL-адрес вручную в своем источнике HTML - URL-адрес, на который вы ссылаетесь.

Вы можете (необязательно) внедрить внешнее «перенаправление» позже, если хотите — это изменит URL-адрес. Но это только для перенаправления поисковых систем и третьих лиц, которые могли ссылаться на старые URL-адреса или проиндексировать их. Итак, это для SEO, а не для того, чтобы ваше приложение «работало».

Итак, в общем, в таком порядке:

  1. Измените URL-адрес в источнике HTML, чтобы вы ссылались на URL-адреса формы /server/ServerName.
  2. (НЕОБЯЗАТЕЛЬНО) Если вы меняете существующую структуру URL, перенаправьте любой прямой запрос с /server/?Server=ServerName (или /server/index.php?Server=ServerName) на /server/ServerName (канонический URL).
  3. Внутренне перепишите запрос с /server/ServerName (канонический URL-адрес / URL-адрес, на который вы ссылаетесь) на /server/index.php?Server=ServerName (базовый файл, который обрабатывает запрос).

В корневом .htaccess файле:

RewriteEngine On

# (OPTIONAL) For SEO, if changing an existing URL structure...
# Redirect "/server/?Server=ServerName" to "/server/ServerName"
RewriteCond %{QUERY_STRING} ^Server=([^&./]+)(&|$) [NC]
RewriteRule ^server/(index\.php)?$ /server/%1 [NE,R=301,L]

# Rewrite request from "/server/ServerName" to "/server/index.php?Server=ServerName"
RewriteRule ^server/([^/.]+)$ server/index.php?Server=$1 [END]

Это предполагает, что вы используете Apache 2.4, чтобы иметь возможность использовать флаг END в последнем правиле. Это позволяет избежать дополнительного условия в первом правиле, которое проверяет прямой запрос, а не «переписанный» запрос (чтобы избежать цикла перенаправления).

В первом правиле («перенаправление») часть index.php необязательна. Обратная ссылка %1 содержит значение параметра URL Server, полученное в предыдущем условии. Параметр URL-адреса Server должен быть непустым и не содержать точек или косых черт (согласно регулярному выражению, которое вы указали в последнем правиле), иначе он не будет перенаправлен или перезаписан. Обратите внимание, что литеральную точку в классе символов регулярных выражений не нужно экранировать обратной косой чертой.

Обратите внимание, что я предположил (согласно вашему примеру), что запрашиваемый URL-адрес не заканчивается косой чертой (т.е. /server/ServerName, а не /server/ServerName/), поэтому я удалил необязательный /? в конце шаблона RewriteRule в последнем правиле. . Хотя ваша выдержка из журнала, казалось бы, предполагает обратное? Если вам нужно было разрешить URL-адреса как с косой чертой, так и без косой черты, то это должно быть реализовано как отдельное «перенаправление», чтобы канонизировать URL-адрес, а не как часть «перезаписи», которая в противном случае способствовала бы дублированию контента (слэш и URL-адреса без косой черты — это разные URL-адреса).

В зависимости от значений, которые вы ожидаете в значении параметра Server URL, флаг NE (noescape) может быть или не быть необходимым. Переменная сервера QUERY_STRING уже закодирована в URL.

Вам не нужно использовать флаг PT (passthrough) в .htaccess, так как это поведение по умолчанию в этом контексте. (Флаг PT имеет значение только при использовании mod_rewrite в контексте сервера или виртуального хоста.)

Спасибо вам за разъяснение. Теперь это имеет гораздо больше смысла, и ваши изменения работают. Я обязательно прочитаю больше о модуле перезаписи, чтобы это не было проблемой с моей стороны.

Codewow 01.05.2023 13:53

Другие вопросы по теме