.htaccess 使用 WordPress 插件重写

.htaccess rewrite with WordPress plugin

我正在为自定义 WordPress 多站点网络构建 WordPress 插件,并且有一些文件使用 URL 变量从第二个数据库(不是 WordPress 数据库)加载信息。

在通过导航到 http://website.com/NAME-HERE 在 WordPress 外部构建的版本中,它将检查它是否是我数据库中的用户名,如果不是,则检查它是否是我数据库中的一个组并加载文件对应于它是用户名还是组。

现在我完全不知道如何在 WordPress Multisite 中实现它。据我所知,插件无法进行 .htaccess 重写?如何让它在所有网站上运行?

如果不是,最好的方法是什么?

我是否需要将我的 pretty.php.htaccess 重写到我的根目录并将页面指向位于插件中的文件?如果是这样,这如何与多个主题一起使用?

到目前为止,我唯一的其他想法是,也许这可以通过 RewriteMap 之类的东西来实现。

在这一点上,我认为我最好的选择是联系 Whosebug 社区寻求帮助或指导。

.htaccess

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

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^(\w.+)$ ./pretty.php?pretty= [QSA]

ErrorDocument 404 /404.php

pretty.php

// First check if passed pretty parameter is a username.
if(checkIfUserByUsername($_GET['pretty']))
{
    $_GET['username'] = $_GET['pretty'];

    include("USERNAME.php");

// If not a username, check to see if it's an event.
}else if(checkIfStreamByPretty($_GET['pretty'])){
    $_GET['id'] = getStreamIdFromPretty($_GET['pretty']);

    include("GROUP.php");
}else{
    // If it's none, redirect to the 404 page.

    include("404.php");
}

我想提供更多有关我希望完成的内容的上下文,我正在创建页面模板文件,其中一个用于配置文件,另一个用于组,正如您在我的 .htaccess 和 pretty.php然后我在页面模板文件的顶部然后使用

$user_id = getIdFromUsername($_GET['username']);
$_GET['user_id'] = $user_id;

我真的很难弄清楚如何以一种允许它处理多个主题的方式来解决这个问题。目前只是在寻找任何一种解决方案。

如果我理解您想要实现的目标,您可以通过多种方式来解决这个问题。您可能不需要使用任何重写。

最简单的解决方案是将 "pretty.php" 代码添加到 Wordpress 模板中的 header.php 文件中。这将加载到网站前端的每个请求。如果您需要它仅在特定页面上加载代码,只需使用 is_page.

检查您所在的页面

例如,在您的 header.php:

if(is_page("groups")){
  if(checkIfUserByUsername($_GET['pretty']))
  {
    // the rest of your code
  }
}

如果你想写一个Wordpress插件,你只需要在你的插件中使用"add_action":

add_action('wp_head', 'function_containing_your_code');

同样,这将在每个页面上加载,因此只需检查您是否位于要加载代码的页面上。

https://codex.wordpress.org/Plugin_API/Action_Reference/wp_head https://developer.wordpress.org/reference/functions/is_page/

此外,您可以编辑 .htaccess 文件,就像您可以编辑您的用户有权编辑的任何文件一样。假设您是 运行 一个 apache 服务器,您的 .htaccess 文件需要具有允许编辑该文件的权限,并且您可以使用 PHP 编辑该文件。例如:

$file = fopen("/path/to/.htaccess", "a+");
fwrite($f, "RewriteRule ^(\w.+)$ ./pretty.php?pretty= [QSA]");
fclose($f);

很多人会说 PHP 写入您的 .htaccess 文件存在安全风险。我会说在某些情况下确实如此,但肯定并非总是如此。在允许 PHP 写入您的 .htaccess 文件之前让您了解权限。

除了 John Gile 的回答之外,请清理 Get 参数。您可以阅读一些清理选项 here

在您的问题上下文中,类似 $username = sanitize_text_field( $_GET['pretty'] ); 的内容应该就足够了。但请更深入地了解需要清理的内容。

关于你原来的问题,约翰建议的第一种方法似乎更好。

考虑两个单独的请求使用相同的用户名请求相同的 url 的时刻。由于 File Reading/Writing 是一个阻塞流,其中一个请求必须等待流关闭,并且在这种情况发生之前网站不会呈现。

如果您使用额外的流或任何可能导致重复条目或更糟的文件损坏的风险来绕过它,这可能会导致服务器错误。

编辑

我不太确定您想要实现什么,包括 include('USERNAME.php') 您是否为每个注册您的 "multi-site network" 的用户创建一个专用的 php 文件?如果是这样,我认为你在计划时做出了错误的决定。

通常当您想要根据外部资源共享、控制或改变行为时,您会以 JSON 数据格式获取数据。

现在,如果我处在你的位置,我会创建一个 REST Web 服务,returns JSON 根据用户名获取参数并根据数据控制输出进来了。

创建 api 相当复杂,根据您的需要,您可以选择最适合这些的工具。我个人很喜欢与 apigility for rather complex things and lumen 一起做小事。如果您愿意,也可以自己创建。

创建 api 后,您可以轻松获得 file_get_contents() 描述的 的 JSON 或使用您可以为 php 找到的任何休息工具.