Я новичок в Apache mod_rewrite
и мне трудно заставить его делать то, что я хочу.
В моем статическом каталоге у меня есть файлы javascript (.js
) с двумя видами имени файла:
xxxx.js
стандартное имя файла AT_xxxx.js
(с префиксом имени файла), который был дублирован из предыдущего стандартного имени файла, но также содержит мои настройкиЯ хотел бы проанализировать запросы для каждого стандартного запрошенного файла javascript (xxxx.js
), чтобы проверить, существует ли настроенный файл (AT_xxxx.js
), включая все подкаталоги. Затем, в этом случае, используйте пользовательский файл вместо стандартного файла (возможно, путем внутреннего перенаправления).
Я пытался понять это часами, но все равно что-то не так.
Примечание: Кроме того, я не знаю, как найти пользовательские файлы в подкаталогах.
DocumentRoot "/data/apps/dev0/custom/my_static"
<filesMatch "\\.(js)$">
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/AT_$1.js -f
RewriteRule ^(.*[^/])/?$ %{DOCUMENT_ROOT}/AT_$1.js [QSA,L]
</filesMatch>
В вашем RewriteCond есть обратная ссылка (1 доллар США). Но для того, чтобы использовать обратную ссылку, вам сначала нужно что-то записать и вставить. Попробуйте что-то вроде этого:
RewriteCond %{REQUEST_URI} ^/(.*).js$
RewriteCond %{DOCUMENT_ROOT}/AT_%1.js -f
RewriteRule ^(.*[^/])/?$ %{DOCUMENT_ROOT}/AT_$1.js [QSA,L]
Что происходит выше, так это то, что первое условие проверяет, заканчивается ли запрошенный URI на .js, и если да, сохраняет имя файла (до .js) в обратной ссылке RewriteCond% 1. Затем второй проверяет, существует ли имя файла (хотя и начинается с AT_), и, если да, перезаписывает его.
Я нашел это:
<filesMatch "\\.(js)$">
# Split into two variables, $1 is everything before the filename, $2 the filename without extension
RewriteCond %{REQUEST_FILENAME} ^(.+)/([^/]+)\.js$
# Add AT_ prefix and check if file exists
RewriteCond %1/AT_%2.js -f
# Internal Redirect with new file with AT_ prefix
RewriteRule ^(.+)/([^/]+)\.js$ %1/AT_%2.js [NC,L]
</filesMatch>