Afin de refléter un site Web entier en HTML statique,
Je voudrais convertir des URL comme http://example.com/script.php?t=12
à http://example.com/script.php_t=12
.
L'avis ?
dans l'URL est en cours de conversion _
.
Cela permettra à nginx ou apache de servir ces fichiers à partir du disque en tant que HTML brut que nous avons obtenu et enregistré à partir wget
- un fichier pour chaque URL - plutôt qu'en tant que fichier PHP.
Est-il possible de le faire via la réécriture d'URL Nginx?
http://example.com/script.php?a=1&t=3
va nécessiter une action de réécriture super sophistiquéet
commef
,u
, etc.Réponses:
J'ai obtenu ce travail en utilisant try_files:
Cela va essayer de trouver un fichier sur le disque nommé d'après le modèle que vous avez fourni avec un "_" au lieu du "?".
La configuration supplémentaire dépend de la façon dont vous avez enregistré des fichiers statiques comme des images ou des feuilles de style. Vous pouvez ajouter une solution de secours en essayant de les lire sans disque de formulaire de chaîne de requête comme ceci:
la source
location ~ \.php$
on peut se mettretry_files
au travail, mais ça ne marche paslocation /
Quelque chose le long des lignes:
la source
?
réponse que j'ai utilisée..*
clause plus stricte dans le premier paramètre de réécriture. C'est extrêmement utile!Je ne pense pas que vous pourrez le faire avec vanilla nginx mais si vous êtes prêt à installer le module Lua pour nginx ( http://wiki.nginx.org/HttpLuaModule ), vous pouvez le faire.
Testé localement et semble faire ce que vous cherchez. Si vous souhaitez conserver les autres paramètres séparés par des esperluettes, changez le bloc rewrite_by_lua en
la source
Cela fonctionne sur nginx / 1.6.2.
Mais personnellement, j'utiliserais une
try_files
solution avec un retour à un URI d'origine s'il y en a .Par exemple, si vous avez
script.php
sur le disque, il essaiera d'abord, puis s'il n'y en a pas, il ira pourscript.php_t=12
.try_files
a besoin d'une version assez récente de nginx.Et si cela ne suffit pas, vous pouvez faire ceci dans un
if
:la source
?
à la fin de votre réécriture là-bas pour que les paramètres de requête n'y soient pas ajoutés.)try_files
va s'arrêter$uri
s'il y a un bloc d'emplacement correspondant à cela, ou un fichier pour cela (la demande sans obtenir d'arguments) - est-ce le cas??
n'a aucun effet visible sur les fichiers statiques, vous ne verriez qu'une requête supplémentaire dans vos journaux d'accès; si vous vous en souciez, ajoutez un point d'interrogationLe wiki dit
Alors ça
rewrite ^ ${uri}_$args? last;
devrait marcher.la source
rewrite ^ $uri_$args? last;
Les réponses suggérées ci-dessus devraient fonctionner. Cependant, vous voyez à quel point votre URL devient sensible. Étant donné que nginx essaie de vérifier si le nom de fichier existe d'abord sur le serveur, tout paramètre supplémentaire le supprimera.
Ma suggestion est de laisser l'URL telle quelle et de la router vers le fichier correct avec php. Vous avez accès au
t
paramètre.la source