【问题标题】:Prevent creation of HTML element that should be created with PHP --- with PHP itself防止创建应该使用 PHP --- 使用 PHP 本身创建的 HTML 元素
【发布时间】:2020-03-18 22:02:06
【问题描述】:

我使用 CMS MediaWiki,其中包含许多我希望阻止在所有网页中解析的功能,否则这些功能将包含它们。
一些这样的功能(例如次要的内置菜单链接)我很适合用 CSS 或 JavaScript 来阻止,但其他一些则不是,这是我的问题:

由于用户可以取消 CSS 和/或 JS,因此该用户最终可能会使用“阻止”功能。
我的问题的一个很好的实际例子是我希望防止在太多基于 MediaWiki 的社区中解析 I found causing more harm than good 的编辑摘要框。

由于我不是 PHP 程序员,我不想从头开始研究和编辑 MediaWiki CMS 的大量源代码(以及自动升级等例外),我更喜欢间接(“tweak”)解决方案:

MediaWiki 有一个LocalSettings.php 文件,可以在其中运行自定义 PHP。
我希望运行一些 PHP 函数,根据某些标准(可能是 CSS 类),将阻止解析之前解析过的元素,例如编辑摘要框。
如果当前版本甚至可以做到这一点PHP的,如果是这样,怎么能做到这一点?

【问题讨论】:

  • 赞成,因为我认为这值得关注。我要说的是,我不确定这是可能的。来自页面的任何提交都将转到后端并进行处理。我认为您无法通过将 PHP 代码放入不同的文件来阻止这种情况。我会补充一点,自从我接触 PHP 以来已经有一段时间了,所以也许我错了。
  • 好吧,如果您可以使用 PHP,这意味着您可以通过 JS 更改 JS 并最终更改 CSS,have a look
  • @Vladan 这没有意义。如果我只是在浏览器中停用 JS 会怎样?

标签: php html css templates mediawiki


【解决方案1】:

不,不可能从不同的文件中更改 HTML 代码,除非您有某种中间件可以将代码作为纯文本检索、编辑(例如使用正则表达式)并将其传递给实际的视图,这几乎听起来像一个 MVC 模式。如果这就是 MediaWiki 的工作方式(我非常怀疑),那么这就是你的方式。

为什么它不起作用?这是因为 PHP 是一种后端语言。它无法与前端交互,因为 PHP 脚本/文件(包含您的 HTML)将在服务器(=您的后端)执行,然后传递给浏览器。

想象一下(非常非常简单):
your_file.php
这是执行脚本之前服务器上文件的状态:

<div>
  <?php
    echo "<a>test</a>;
  ?>
</div>

然后在您的服务器上执行脚本,结果:

<div>
  <a>test</a>
</div>

您的文件甚至还没有发送到浏览器,但它现在会发送。遗憾的是,您的文件已被执行,您将无法执行任何 PHP 函数。不,你不能在你的服务器上使用 CSS 和 JS。


由于您可能无法实现顶部描述的模式,因此还有最后一个希望。我不熟悉 MediaWiki,但我想我听说他们在实际的 PHP 文件中生成页面。如果是这种情况,只需执行以下操作:

<div>
  Yey, some nice features I want to keep!
</div>
<?php
/*
<div>
  Oh no! A feature I should hide!
</div>
?>
<div>
  Yey, some nice features I want to keep!
</div>

只需将其注释掉;)。如果这也不起作用,那么……好吧,没有您想要的解决方法,更不用说简单的解决方法了。

【讨论】:

    【解决方案2】:

    你不能通过 PHP 来做到这一点,但如果你有服务器访问权限,你可以尝试一些高风险的方法,只是为了艺术。

    免责声明:这些不是实用的解决方案,除非您知道自己在做什么并且没有其他可能的方法,否则切勿使用它们。

    因此,假设您只能编辑服务器配置和 LocalSetings.php,您可以:

    1. 使用重写规则将所有请求定向到您的 LocalSettings.php 文件,从而有效地更改 CMS 的入口点。然后,您可以使用 ob_get_clean() 捕获输出并根据需要进行修改。
    2. 使用 nginx,使用sub_filter 在 HTML 到达浏览器之前过滤掉它。

    由于您不想弄乱 CMS 源代码,因此我假设您希望更少地更改服务器配置。但是我仍然会在这里留下我的答案,以防将来对其他人有所帮助。

    【讨论】:

    • 嗨;谢谢;实际上,我做一些服务器/bash“技巧”比 PHP 技巧更方便,一般来说......这是一个“共享”CentOS 服务器环境,托管公司(Siteground)使用 Apache-Nginx 的组合(Nginx 作为“反向代理”,我不知道这意味着什么),但它们确实只给​​了我有限的 Apache 访问权限(.htaccess files) and some cron` 作业和我的用户分区中的 CLI 控制台。
    • 也许你在上面的评论之后有什么要添加/编辑的。
    • 嘿@ShadowyShade,感谢您的赏金:) 反向代理只是服务器端的代理(“普通”代理是您在计算机上使用的东西)。假设您的 CMS 根目录中的 index.php 旁边有一个 .htaccess 文件,您可能会在那里实现一个 RewriteRule,它将所有请求发送到 LocalSettings.php。然后基本上将代码从 index.php 复制到 LcocalSettings.php,将其包装在 ob_start()ob_get_clean() 中,并在那里替换你想要的东西。同样,不能保证这会真正起作用,但你可以试一试:)
    • Thx Pavel --- 我认为即使它有效;应该存在重大的性能问题吗?顺便说一句,您可能希望将其作为答案的一部分,因为 cmets 可能会被删除。
    • 我基本上只是重复了答案,除了 ReverseProxy 部分 :) 我不认为它会带来任何性能问题,但我认为关闭 CMS 中的模块可能更容易源代码。
    猜你喜欢
    • 2019-12-11
    • 1970-01-01
    • 2012-03-06
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2021-07-08
    • 2021-04-09
    相关资源
    最近更新 更多