Как разрешить перенаправление URL, только если пользователь зашел на сайт Wordpress? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь разрешить перенаправление URL (из URL / dl), только если пользователь вошел на сайт WordPress. В противном случае не позволяйте. Однако, когда я нажимал на эти URL-адреса со входом в систему или без нее, он показывал «страница не найдена».

Я использовал этот код .htaccess на уровне public-html:

RewriteEngine On
RewriteCond %{HTTP_COOKIE} ^.*wordpress_logged_in.*$ [NC]
RewriteRule ^dl/?$ https://external.com/directdownload- [L,R=301]

Я ожидаю, что вошедшие в систему пользователи смогут перенаправлять на https://external.com/directdownload- ссылки и не разрешать перенаправление (и перенаправлять их на страницу входа), если они не вошли в WordPress. Однако, когда я нажимаю на ссылки, которые похожи на https://www.example.com/dl/23434234/link.html и вошли в систему, и не вошли в систему, происходит переход на «страницу не найдена». Как исправить?

1 Ответ

0 голосов
/ 16 мая 2019

MOD Rewrite (HTACCESS) происходит задолго до загрузки WP, поэтому нет никакого способа узнать, аутентифицированы ли они WP или нет.Вы можете получить Session Cookie, возможно, но даже это всего лишь Session ID, и нет способа обработать его из HTACCESS

. Что я хотел бы сделать, это создать простую страницу PHP и вставить в нее что-то вроде этого(непроверенные).

download.php

//load WP without theme support or hooks etc.
define('WP_USE_THEMES', false);
require('./wp-load.php'); //location of this file may be different 

if(get_current_user_id()){
    //user has valid WP login session
    header('Location: {location of perl script}');
}else{
    //user is not logged in
    header('Location: {location to boot them to}');
}
exit; //just because

Я бы поместил этот файл в то же место, что и файл index.php для wordpress.Потому что WordPress HTACCESS имеет это правило:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

В основном RewriteCond %{REQUEST_FILENAME} !-f говорит, что это не настоящий файл, продолжайте.Поскольку download.php является реальным файлом, он не будет перенаправлять на index.php как обычно.Он просто загрузит download.php.

В download.php мы загружаем WP, поэтому нет необходимости переходить на index.php.Это дает нам полный контроль над кодом, потому что он находится за пределами WordPress, но у нас все еще есть доступ к основным функциям WordPress для проверки входа в систему.

Затем вы выполняете перенаправление на стороне сервера, основываясь на том, вошли ли они в систему.или нет.Поэтому, где у меня есть {location .... }, вы помещаете туда, куда отправили бы их в своем HTACCESS.

Теперь, если вам нужно отправить больше данных или иметь много ссылок для скачивания, вы можете передавать информацию обычным способом, как вы делаете это в PHPиспользуя GET

   download.php?filename=somefile.txt

Затем, когда вы делаете перенаправление, вы можете использовать $_GET['filename'], чтобы помочь в построении пути загрузки.Будьте осторожны с разделителем каталогов, так как он может разрешить так называемые атаки DirectoryTransversal.

https://en.wikipedia.org/wiki/Directory_traversal_attack

Вы также можете использовать часть URL URI.

   download.php/somefile.txt

И $_SESSION['REQUEST_URI'], но вам, возможно, придется проделать определенную работу, чтобы получить именно то, что вам нужно.У меня нет возможности узнать, что это такое, поэтому я могу только делать общие предложения.

Надеюсь, это поможет.

...