Я пытаюсь просто переписать 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]
@MrWhite Спасибо за ответ. /server/ — это каталог. Index.php — это файл в каталоге, который он будет использовать. Я пытаюсь получить localhost/server/ServerName вместо localhost/server/?Server=ServerName или localhost/server/index.php?Server=ServerName
Почему вы пытаетесь поместить имя сервера в параметр URL, чтобы сделать его доступным для PHP, когда он уже доступен с помощью $_SERVER['SERVER_NAME']
?
перепишите 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, а не для того, чтобы ваше приложение «работало».
Итак, в общем, в таком порядке:
/server/ServerName
./server/?Server=ServerName
(или /server/index.php?Server=ServerName
) на /server/ServerName
(канонический URL)./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 в контексте сервера или виртуального хоста.)
Спасибо вам за разъяснение. Теперь это имеет гораздо больше смысла, и ваши изменения работают. Я обязательно прочитаю больше о модуле перезаписи, чтобы это не было проблемой с моей стороны.
«переписать URL-адрес на /server/ServerName from /server/?Server=ServerName» — переписывать так не имеет смысла (должно быть наоборот) — что может быть тем, где вы не застреваете. Однако
/server/?Server=ServerName
также не является допустимой конечной точкой... Я предполагаю, что/server/
- это каталог (каталоги не принимают запросы) - какой файл фактически обрабатывает запрос? На какой URL вы ссылаетесь?