Каскадный выбор ресурса с использованием mod_rewrite - PullRequest
0 голосов
/ 02 ноября 2009

Я смотрю на настройку приложения, в котором есть ядро ​​и пространство имен проекта, где ядро ​​является откатом по умолчанию для настройки проекта. для этого я хотел бы иметь возможность каскадировать различные ресурсы, такие как CSS, Javascript и т. д. для целей упражнения, я упростил это как

./.htaccess
./first/firstonly.txt
./first/both.txt
./second/secondonly.txt
./second/both.txt

ожидаемое поведение: запрос будет проверять существование в первую очередь, а затем искать в секунду и, наконец, выдавать 404.

для baseurl / firstonly.txt будет попадать ./first/firstonly.txt (200),
тогда как baseurl / secondonly.txt будет пытаться ./first/secondonly.txt (404) затем ./second/secondonly.txt (200).
baseurl / both.txt ударит ./first/both.txt (200) и не пойдет дальше.
baseurl / nonexistant.txt (404) будет проходить через каскады и возвращать 404.

Я довольно конкурентоспособен с mod_rewrite, поэтому не чувствую необходимости говорить здесь об основах. Каков был бы наиболее эффективный (вменяемый) способ реализации этого? Скорость не имеет значения, так как большую часть времени можно найти при первом ударе.

Ответы [ 3 ]

0 голосов
/ 03 ноября 2009

Некоторые другие потенциальные решения

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^first
RewriteCond %{REQUEST_URI} !^second
RewriteRule ^([^/]+\.?[^/])*$ first/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^second
RewriteRule ^first/([^/]+\.?[^/])*$ second/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(first|second).*$
RewriteRule .* /404.html [L]

или

RewriteCond %{REQUEST_URI} 404.html
RewriteRule .* - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^first
RewriteCond %{REQUEST_URI} !^second
RewriteRule ^([^/]+\.?[^/])*$ first/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^second
RewriteRule ^first/([^/]+\.?[^/])*$ second/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(first|second).*$
RewriteRule .* /404.html [L]

В моем личном тестировании я заметил, что проверка -f точна только для полного пути, что усложняет ситуацию, если вы не в корне документа. Можно ли это исправить, переписав файл, а затем выполнив -f для request_uri?

0 голосов
/ 04 ноября 2009
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f
RewriteRule ^Public/(.*)$ Application/Public/$1 [L]

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

RewriteRule ^(css|scripts|images|assets|flash)/(.*)$ Public/$1/$2 [L]

Это окончательное рабочее решение (за пределами приведенного выше примера с песочницей).

0 голосов
/ 02 ноября 2009

Попробуйте эти правила:

RewriteEngine on
RewriteRule ^(first|second)/ - [L]
RewriteCond %{DOCUMENT_ROOT}/first/$0 -f
RewriteRule ^[^/]+$ first/$0 [L]
RewriteCond %{DOCUMENT_ROOT}/second/$0 -f
RewriteRule ^[^/]+$ second/$0 [L]
...