mod_rewrite, не могу переписать существующий файл - PullRequest
3 голосов
/ 28 сентября 2011

Я пытаюсь передать все изображения в каталоге в watermark.php, используя mod_rewrite в .htaccess.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.jpg$ /watermark.php?path=%{REQUEST_FILENAME} [L]

Он отлично работает на локальном компьютере, но на моем производственном онлайн-сервере (общий хостинг) все файлы изображений обслуживаются без перезаписи.

mod_rewrite включен онлайн, но игнорирует правило, если файл существует.

Что может быть не так?

UPDATE

Вот мои полные настройки: в подпапке основного домена document_root есть домен с поддоменом.

public_html (example.com DOCUMENT_ROOT)/
    img (img.example.com DOCUMENT_ROOT)/

.htaccess в папке public_html:

<FilesMatch "\.(inc\.php|log)$">
    Deny from all
</FilesMatch>
Options -Indexes +FollowSymLinks
php_value short_open_tag 0

php_value auto_prepend_file /home/username/public_html/bootstrap.inc.php

RewriteEngine On

RewriteCond %{HTTP_HOST} ^img\. [NC]
RewriteRule .* - [L]

RewriteCond %{HTTP_HOST} ^www\.(.+) [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^example\. [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ shop/$1 [L]

.htaccess в папке img:

<FilesMatch "\.(inc|log)$">
    Deny from all
</FilesMatch>
Options -Indexes +FollowSymLinks

php_value short_open_tag 0
php_value auto_prepend_file none

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.jpg$ /watermark.php?path=%{REQUEST_FILENAME} [L]    

Проблема в том, что существующие изображения в папке img не переписываются. Апачи просто служат им как есть. Но если, например, я запрашиваю несуществующий файл, правило работает, и echo $_GET['path'] печатает полный путь к несуществующему файлу.

1 Ответ

4 голосов
/ 28 сентября 2011

Вот что вы можете использовать:

RewriteEngine On
RewriteRule ^(media|image|images)(/?)(.*)$ - [F]
RewriteRule ^([a-z0-9\-_\.]+)\.(jpg|jpeg|png|gif)$ /watermark.php?path=%{REQUEST_URI} [L]

Первый RewriteRule настроен на то, чтобы люди не заходили в эту папку - он дает 403 отклоненного разрешения (это необязательно)

Второй будет перенаправлять любые изображения, которые соответствуют буквам, цифрам, тире, подчеркиванию и точкам с расширением: jpg, jpeg, png и gif, в ваш файл watermark.php.Например:

http://www.domain.com/logo.jpg => путь = /logo.jpg

ОБНОВЛЕНИЕ:

Поскольку правило находится в другой папке и в корневом каталоге IMG/home/username/public_html/img/ файл watermark.php не существует.Либо скопируйте нужный файл (watermark.php и его библиотеки) в папку IMG, либо создайте symblink.

cd /home/username/public_html/img/
ln -s ../watermark.php (and other library files as well)
...