1 votes

Apache ModRewrite supprimer une partie de request_uri dans rewriteCondition

En gros, j'ai un lien dans mon html domain.com/app/css/build/app-23471942834.css cependant sur le serveur le fichier se trouve en réalité dans /fs/current/public/css/build/app-23471942834.css. Existe-t-il un moyen de vérifier si un fichier existe dans une RewriteCondition? Le problème est que j'ai essentiellement besoin de vérifier la partie /css/build/app-23471942834.css, sans le /app. Existe-t-il un moyen de supprimer cela dans une condition?

Donc j'ai besoin de:

  • domain.com/app/login soit réécrit en /fs/current/public/login
  • domain.com/app/build/css/app-123523.css soit réécrit en /fs/current/public/build/css/app-123523.css
  • domain.com/app/build/js/app-123523.js soit réécrit en /fs/current/public/build/js/build/app-123523.css

J'utilise Laravel donc dans mon répertoire public il y a un autre .htaccess par défaut avec ceci:

        Options -MultiViews

    RewriteEngine On

    # Rediriger les barres obliques finales si ce n'est pas un dossier...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Gérer le contrôleur frontal...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Gérer l'en-tête d'autorisation
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Désolé, mais je suis vraiment nul en fichiers .htaccess. Merci pour votre aide.

Ce que j'ai jusqu'à présent:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.*)$ /fs/current/public/$1 [L]

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteRule ^app/(.*)$ /fs/current/public/index.php?/$1 [L]

SOLUTION:

J'ai résolu mon problème de cette façon:

RewriteCond %{HTTP_HOST} ^(www.)?domain.de$ [NC]
RewriteCond %{REQUEST_URI} \.(css|jpg|gif|png|js|svg)
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

Donc toutes les réécritures s'appliquent uniquement aux fichiers css/jpg/gif/png/js/svg. Je pense que le problème que j'avais auparavant était que le fichier index.php était également réécrit par le script.

0 votes

Qu'entendez-vous par "besoin de la partie /css/build/app-23471942834.css pour vérifier"? Apparemment, app-23471942834.css n'existe jamais? Pourquoi avez-vous besoin de vérifier que la ressource existe? Ne pouvez-vous pas simplement la réécrire si elle correspond au modèle? Ou est-ce juste un exemple d'un tel modèle et avez-vous beaucoup de différents URLs/fichiers CSS et JS comme celui-ci?

0 votes

Avez-vous plusieurs domaines/hôtes sur le même espace web? Sinon, la vérification %{HTTP_HOST} est inutile.

1voto

MrWhite Points 11269

Essayez ce qui suit :

RewriteEngine On
RewriteRule ^/?app/(css/build/app)-\d+(\.css)$ /fs/current/public/$1$2 [L]

Je ne suis pas certain de ce que vous cherchez, mais cela réécrira internalement une URL de la forme domain.com/app/css/build/app-23471942834.css en /fs/current/public/css/build/app.css.

Si vous avez besoin de vérifier que le fichier de destination existe avant de réécrire, vous pouvez ajouter une condition avant la RewriteRule (bien que je ne sache pas pourquoi vous auriez besoin de le faire, car vous obtiendrez toujours une erreur 404). Par exemple :

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1$2 -f

MISE À JOUR#1 : D'après les commentaires...

Je devrais réécrire tout ce qui n'est pas un fichier

Je comprends mieux. Vous pouvez remplacer la directive RewriteCond ci-dessus par ce qui suit :

RewriteCond %{REQUEST_FILENAME} !-f

Cela n'appliquera la substitution de la RewriteRule que si l'URL demandée ne correspond pas à un fichier sur le système de fichiers.

MISE À JOUR#2 : D'après la question mise à jour...

Une solution plus générale, après la directive RewriteEngine existante, essayez ceci dans le fichier .htaccess :

RewriteCond %{DOCUMENT_ROOT}/fs/current/public/$1 -f
RewriteRule ^app/(.+)$ /fs/current/public/$1 [L]

Cela ne réécrira la demande que si un fichier de forme /fs/current/public/css/build/app-23471942834.css ou /fs/current/public/login existe sur le système de fichiers.

0 votes

Hmm cela semble plutôt bien, cependant je devrais réécrire tout ce qui n'est pas un fichier en /fs/current/public/. Pouvez-vous me dire comment je peux faire cela (PS: J'ai mis à jour l'exemple ci-dessus)

0 votes

Alors, qu'est-ce que %{REQUEST_FILENAME} exactement? Ne devrait-il pas inclure app/? Cela ne vérifierait-il pas si /app/build/css/app-123523.css existe plutôt que /fs/current/public/build/css/app-123523.css?

0 votes

Oui, %{REQUEST_FILENAME} pourrait potentiellement inclure /app/ (ce que je pensais que vous faisiez référence dans votre premier commentaire: "réécrire tout ce qui n'est pas un fichier"). La première RewriteCond vérifie la destination. J'ai mis à jour ma réponse avec une solution plus générale basée sur votre question mise à jour. (Bien que dans votre question, vous indiquiez: "cependant sur le serveur le fichier se trouve effectivement dans /fs/current/public/css/build/app.css" - cela n'inclut pas le code numérique ?)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X