Как написать правило для файлов, которые уже существуют в папке, чтобы они указывали на другое место. Например, для перезаписи любого запроса в pdf-файл в папке wp-content/uploads/ на страницу download/?q=$1.

Я видел в SO связанный вопрос для перемещенных файлов pdf со следующим

# checks that the request is for a file that *does not* exist
RewriteCond %{REQUEST_FILENAME} !-f  
# make sure we've not already redirected to the uploads directory 
# (in case it doesn't exist in there either)
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
# the rule matches against either pdf, zip or xls.
RewriteRule ([^/]*\.(pdf|zip|xls))$ /wp-content/uploads/$1 [NC,L,R=301]

Но я хочу обратного эффекта. Сделайте перенаправление для моих существующих файлов и оставьте 404 not found для несуществующих файлов.

Я безуспешно пробовал другой подход. Интересно, не мешает ли файл WordPress по умолчанию .htaccess в корневой папке. Как переписать все запросы pdf на кастомную страницу?

РЕДАКТИРОВАТЬ:

Файл .htaccess находится в папке wp-content/uploads.

Что касается WordPress Rewrite API, у меня уже есть следующая функция в настраиваемом плагине:

function add_rewrite_rules($aRules) {
    $new_rules = array(
    'exams/([^/]+)/([^/]+)/?$' => 'index.php?pagename=exams&type=$matches[1]&city=$matches[2]',
    'exams/([^/]+)/([^/]+)/subject/([^/]+)/?$' => 'index.php?pagename=exams&type=$matches[1]&city=$matches[2]&subject=$matches[3]'
        );

    return $aRules + $new_rules;
}

Насколько я понимаю, эти функции позволяют нам указывать дополнительные правила перезаписи для WordPress, как описано в Rewrite API / add rewrite Правило документации. Таким образом, это не должно влиять на содержание правил, указанных в файле .htaccess.

2
pQB 16 Апр 2016 в 15:14

2 ответа

Лучший ответ

Предполагая, что ваш WP установлен в корне вашего домена, это будет:

RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} /wp-content/uploads/
RewriteRule ([^\/]+\.pdf)$ /download.php?q=$1 [NC,L,R=301]

Первая строка (удаление ! из вашего примера кода) соответствует только существующим файлам, поэтому, если файл PDF не существует, вы получите стандартный 404.

Второе условие ограничивает совпадения только существующими файлами в папке /wp-content/uploads/, поэтому http://example.com /example.pdf не будет перенаправлен.

Наконец, RewriteRule (затронутый двумя предыдущими условиями) перенаправляет любой существующий файл в вашей папке загрузок, заканчивающийся расширением .pdf, на /downloads.php, передавая имя файла как параметр q.

Таким образом, http://example.com/wp-content/uploads/2016/04/filename.pdf будет перенаправлен на http://example.com/download.php?q=filename.pdf, если filename.pdf существует в папке /wp-content/uploads/2016/04/.

Я проверил это решение в локальной установке фиктивного WP, и оно работает, поэтому я надеюсь, что это поможет.


Изменить: если у вас есть .htaccess в папке uploads , только этого должно быть достаточно:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ([^\/]+\.pdf)$ /download.php?q=$1 [NC,L,R=301]

Вы пробовали то, что предлагалось для комментариев (добавление мусора в .htaccess, чтобы проверить, включен ли он)?

Другой вариант - переместить правила в корень .htaccess ...

4
Jordi Nebot 22 Апр 2016 в 09:10

Вы можете использовать следующее в качестве первого правила в вашем /wp-content/uploads/.htaccess:

RewriteEngine on

RewriteRule ^([^.]+\.pdf)$ /download/?q=$1 [NC,L]

Это приведет к внутреннему перенаправлению /wp-content/uploads/foo.pdf на /download/?q=foo.pdf .

Если вы хотите перенаправить /wp-content/uploads/foo.pdf на /download/?q=foo.pdf (изменение строки URL-адреса со старого на новое, location) используйте полный URL-адрес в Rewrite target, например http://example.com/download /?q=foo.pdf или добавьте флаг переадресации R [NC, L, R]

1
Amit Verma 19 Апр 2016 в 16:06