URL Apache 2.4 à la place :/server/?Server=ServerName à /server/ServerName
P粉038161873
P粉038161873 2024-01-16 19:21:09
0
1
484

J'essaie simplement de transmettre l'URL du paramètre /server/?Server=ServerName 重写为 /server/ServerName,以便 ServerName à PHP.

J'ai actuellement ceci dans mon .htaccess dossier :

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

En essayant de visualiser /server/ServerName/server/?Server=ServerName, j'ai eu une erreur 404.

Voici mon journal de réécriture :

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]

À ce stade, j'ai besoin d'un peu de conseils car je suis frustré et j'ai l'impression qu'il me manque une chose simple.

J'ai essayé d'ajuster :

  • La chaîne de requête mod_rewrite renvoie 404
  • Différence entre 1 $ et %1 dans
  • .htaccess
  • Pourquoi est-ce que j'obtiens une erreur 404 lorsque j'utilise .htaccess RewriteRule ?
  • En utilisant l'exemple sur https://httpd.apache.org/docs/2.4/rewrite/remapping.html
  • Citation de https://cheatography.com/davechild/cheat-sheets/mod-rewrite/

J'ai également cherché à réécrire le code pour essayer de voir s'il s'agit réellement d'une réécriture.

À l'aide du code ci-dessous, j'ai réussi à déplacer le répertoire /test2/ 重写为 /server/?Server=ServerName et la page s'est bien chargée, je sais donc que le module est actif et en cours d'exécution.

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

J'ai essayé de faire ce changement sans succès. L'URL ne sera pas réécrite, mais la page se chargera. Réécriture d'URL conviviale Apache 2.4 .htaccess

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

P粉038161873
P粉038161873

répondre à tous(1)
P粉182218860

Vous semblez aller dans la mauvaise direction. Le /server/ServerName,因此在内部将请求从 /server/ServerName 重写为 /em> /server/index.php?Server=ServerName (请注意添加 index.php,如注释中所述)。 /server/index.php?Server=ServerName dans la source HTML vers laquelle vous devriez créer un lien est le chemin du fichier sous-jacent (caché) qui gère réellement la demande.

Bien que vous semblez l'avoir mentionné dans la dernière ligne...

L'URL doit être réécrite, sinon la page ne se chargera pas. Il peut y avoir une certaine confusion quant à ce qu'est exactement une « réécriture ». Cela ne change pas l'URL. Vous n'utilisez pas .htaccess pour modifier l'URL. Vous devez modifier manuellement l'URL dans la source HTML - l'URL vers laquelle vous souhaitez créer un lien.

Si vous le souhaitez, vous pouvez (éventuellement) implémenter une "redirection" externe plus tard - cela modifie l'URL. Mais c'est uniquement pour rediriger les moteurs de recherche et les tiers qui peuvent créer un lien vers ou indexer l'ancienne URL. C'est donc pour le référencement, pas pour faire "fonctionner" votre application.

Donc, en résumé, dans cet ordre :

  1. Modifiez l'URL dans le code source HTML pour créer un lien vers l'URL formatée /server/ServerName.
  2. (Facultatif) Si vous modifiez la structure d'URL existante, redirigez toutes les demandes directes vers /server/?Server=ServerName (ou /server/index.php?Server= ServerName) à /server/?Server=ServerName (或 /server/index.php?Server=ServerName) 到 /server/ServerName (URL canonique).
  3. Réécrit en interne la requête de /server/ServerName(规范 URL/您要链接到的 URL)重写为 /server/index.php?Server=ServerName (l'URL canonique/l'URL vers laquelle vous souhaitez créer un lien) vers /server/index.php?Server=ServerName (le fichier sous-jacent qui gère la requête).

Dans le fichier racine .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= [END]

Cela suppose que vous utilisez Apache 2.4 pour pouvoir utiliser le drapeau END dans la dernière règle. Cela évite d'avoir une condition supplémentaire dans la première règle qui vérifie les requêtes directes au lieu des requêtes "réécrites" (pour éviter les boucles de redirection).

Dans la première règle ("Redirect"), la partie index.php est facultative. La référence arrière %1 contient la valeur du paramètre URL Serveur capturé dans la index.php 部分是可选的。 %1 反向引用包含在前面的条件中捕获的Server URL 参数的值。 Servercondition

précédente. Le paramètre URL Serveur doit être non vide et ne pas contenir de points ou de barres obliques (selon l'expression régulière que vous avez donnée dans la règle précédente), sinon il ne sera ni redirigé ni réécrit. Notez que les points littéraux dans les classes de caractères d'expression régulière ne nécessitent pas d'échappement par barre oblique inverse. 🎜

Veuillez noter que je suppose (sur la base de votre exemple) que l'URL demandée ne se termine pas par une barre oblique finale (c'est-à-dire /server/ServerName plutôt que /server/ServerName/), j'ai donc supprimé la dernière règle facultative /? à la fin de RewriteRule /server/ServerName 而不是 /server/ServerName/),因此我删除了 RewriteRule pattern 末尾的可选 /?pattern

. Bien que votre extrait de journal semble suggérer le contraire ? Si vous devez autoriser les URL avec barre oblique finale et sans barre oblique finale, cela doit alors être implémenté en tant que « redirection » distincte afin de normaliser l'URL, plutôt que dans le cadre d'une « réécriture » qui autrement favoriserait le contenu en double (barres obliques). et les URL sans barres obliques sont des URL différentes).

Server URL 参数值中期望的值,NE (noescape) 标志可能是也可能不是必需的。 QUERY_STRING URL codée en fonction de vos

variables de serveur.

.htaccess 中使用 PT (passthrough) 标志,因为这是此上下文中的默认行为。 (PTVous n'avez pas besoin d'utiliser le drapeau qui n'est pertinent que lors de l'utilisation de mod_rewrite dans un contexte server ou vhost

. )🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal