.htaccess用WordPress插件重写

问题描述:

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

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

现在我完全失去了将其应用于WordPress多站点的问题。据我所知插件不能使.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; 

我真的很努力想办法解决这个问题,让它能够处理多个主题。在这一点上寻找任何解决方案。

+0

目前尚不清楚您希望达到的效果。请分解您的问题,以便更真实地了解您真正想要发生的事情,而不是您遇到的困难。至于'.htaccess'的编辑,您可以检查其他插件,它们可以编辑'.htaccess'文件,例如'All In One WP Security&Firewall'。 – fyrye

+0

如果我转到example.com/Dustin,它会检查它是否有用户名或组,并显示它所属的页面模板文件。 –

+0

,但它也需要为创建的多站点工作example.com/SITE/Dustin –

如果我理解你想达到的目标,有几种方法可以解决这个问题。您可能不需要使用任何重写。

最简单的解决方案是将您的“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文件之前让你明白权限。

+0

无论如何,我们可以通过Skype聊天或什么? –

+0

我有.htaccess重写工作,但它只适用于我的主站点不是网络中的所有站点。 –

+0

这也是我进入的方向。我会说,允许wordpress拥有对'.htaccess'的写入权限并在生产中应用更改是不好的做法。一次错误的写入会导致整个网站的网络无法使用。根据服务器配置和第三方插件的使用情况,编辑'.htaccess'可能不合意。例如服务器端和客户端缓存,防止应用新规则。这样做甚至可能会降低响应能力,因为需要为每个请求处理许多重写规则。 – fyrye

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

在你的问题上下文有点像$username = sanitize_text_field($_GET['pretty']);应该是足够的。但请深入了解需要消毒的东西。

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

请考虑两个单独的请求请求具有相同用户名的相同网址的时刻。由于文件读取/写入是阻塞流,其中一个请求必须等待流关闭,并且网站不会呈现,直到发生这种情况。

如果你绕过这个额外的流或任何你冒着最终重复条目或更坏的文件可能导致服务器错误的风险。

编辑

我'不太清楚你正在努力实现与包括include('USERNAME.php')你创造为您的“多站点网络”的招牌了每个用户专用的PHP文件是什么?如果是这种情况,我认为你在制定这个计划时做出了错误的决定。

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

现在,如果我是你的话我想创建取决于用户名的JSON得到的参数,并根据数据来控制输出,它返回一个REST Web服务。

创建API是相当复杂并根据您的需要,您可以使用适合这些最佳工具的任何工具。我个人很喜欢apigility用于相当复杂的事情,lumen用于小事情。如果您选择,您也可以自己创建。

创建api后,您可以很容易地获得与file_get_contents()描述的JSON here或使用任何其他工具,你可以找到的PHP。

+1

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