.htaccess 用 WordPress 插件重写

Posted

技术标签:

【中文标题】.htaccess 用 WordPress 插件重写【英文标题】:.htaccess rewrite with WordPress plugin 【发布时间】:2018-03-08 08:19:33 【问题描述】:

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

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

现在我完全迷失了在 WordPress Multisite 中实现这一点。据我所知,插件不能让.htaccess 重写?如何让它在所有网络站点上运行?

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

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

到目前为止,我唯一的另一个想法是,这可能可以通过 RewriteMap 之类的东西来完成。

此时,我认为最好的办法是联系 *** 社区寻求帮助或指导。

.htaccess

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

RewriteCond %SCRIPT_FILENAME !-d
RewriteCond %SCRIPT_FILENAME !-f

RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [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;

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

【问题讨论】:

目前尚不清楚您希望达到的预期结果。请分解您的问题,以便更简洁地说明您真正想要发生的事情,而不是您遇到的困难。至于对.htaccess 的编辑,您可以查看其他对.htaccess 文件进行编辑的插件,例如All In One WP Security & Firewall 如果我访问 example.com/Dustin,它会检查它是用户名还是组,并显示它所属的页面模板文件。 但它也需要为 example.com/SITE/Dustin 创建的多站点工作 【参考方案1】:

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

最简单的解决方案是将“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=$1 [QSA]");
fclose($f);

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

【讨论】:

我们可以通过 Skype 或其他方式聊天吗? 我的 .htaccess 重写工作正常,但它只适用于我的主站点,而不是网络中的所有站点。 这也是我的方向。我想说允许 wordpress 对.htaccess 具有写入权限并在生产中应用更改是不好的做法。一次错误的写入就会导致整个站点网络瘫痪。根据服务器配置和第三方插件的使用,编辑.htaccess 可能是不可取的。例如服务器端和客户端缓存,防止应用新规则。由于需要为每个请求处理许多重写规则,因此这样做甚至可能会降低响应速度。 好的,如果我使用重写规则 RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA] 我如何让它适用于所有多站点站点而不是只是主站点。让我们从这里开始。 差不多一年后才回到这篇文章,在忘记它之后,这是直接合并到 404 页面的最佳答案。【参考方案2】:

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

在您的问题上下文中,$username = sanitize_text_field( $_GET['pretty'] ); 之类的内容就足够了。但请深入了解需要消毒的地方。

关于您最初的问题,约翰建议的第一种方法似乎更好。

考虑一下两个单独的请求正在使用相同的用户名请求相同的 URL。由于文件读取/写入是阻塞流,因此其中一个请求必须等待流关闭,并且网站在这种情况发生之前不会呈现。

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

编辑

我不太确定你想通过包含include('USERNAME.php') 来实现什么你是否为每个注册你的“多站点网络”的用户创建一个专用的 php 文件?如果是这种情况,我认为您在计划时做出了错误的决定。

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

现在,如果我站在你的立场上,我会创建一个 REST 网络服务,它根据用户名获取参数返回 JSON,并根据传入的数据控制输出。

创建 api 相当复杂,根据您的需要,您可以使用最适合这些的任何工具。我个人喜欢与apigility 一起处理相当复杂的事情,而lumen 则处理小事情。如果您愿意,也可以自己创建它。

创建 api 后,您可以轻松地使用 file_get_contents() 描述的 here 获取 JSON,或者使用您可以找到的任何 php 休息工具。

【讨论】:

好的,如果我使用重写规则 RewriteRule ^(\w.+)$ ./pretty.php?pretty=$1 [QSA] 我如何让它适用于所有多站点站点而不是只是主站点。

以上是关于.htaccess 用 WordPress 插件重写的主要内容,如果未能解决你的问题,请参考以下文章

WordPress对url做重定向处理

WordPress 管理页面重定向到主页

wordpress 插件开发添加到 htaccess 文件中

带有域掩码的 WordPress 站点的 htaccess 重定向不起作用

使用 .htaccess 正则表达式重定向 wordpress 结构的正确方法

wordpress 和 htaccess 301 重定向没有管理员