1 votes

Apache ModRewrite supprime 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 réellement dans /fs/current/public/css/build/app-23471942834.css. Y a-t-il un moyen de vérifier si un fichier existe dans une RewriteCondition? Le problème est que j'ai essentiellement besoin de la partie /css/build/app-23471942834.css pour vérifier, sans le /app. Est-il possible d'enlever cela dans une condition?

Donc j'ai besoin de :

  • domain.com/app/login doit être réécrit en /fs/current/public/login
  • domain.com/app/build/css/app-123523.css doit être réécrit en /fs/current/public/build/css/app-123523.css
  • domain.com/app/build/js/app-123523.js doit être 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

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

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

Voici 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 manière :

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

Que voulez-vous dire par "besoin de la /css/build/app-23471942834.css partie 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 le réécrire s'il correspond au motif? Ou est-ce juste un exemple d'un tel motif et avez-vous beaucoup d'URL/fichiers CSS et JS différents 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 sûr de ce que vous cherchez exactement, mais cela réécrira de manière interne 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 si le fichier de destination existe avant de le réécrire, vous pouvez ajouter une condition avant le RewriteRule (bien que je ne sache pas pourquoi vous auriez besoin de le faire, car vous obtiendrez quand même un 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

Ah d'accord, cela a plus de sens. Vous pouvez remplacer la directive RewriteCond ci-dessus par la suivante :

RewriteCond %{REQUEST_FILENAME} !-f

Cela ne traitera la substitution suivante de 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 ce qui suit 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 la forme /fs/current/public/css/build/app-23471942834.css ou /fs/current/public/login existe sur le système de fichiers.

0 votes

Hmmm cela semble plutôt bon, 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: exemple ci-dessus mis à jour)

0 votes

Alors, qu'est-ce que %{REQUEST_FILENAME} exactement? Ne contiendrait-il pas le 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} inclurait potentiellement /app/ (que je pensais être ce à quoi 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 réellement 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