【问题标题】:Altering .htaccess with PHP - removing a rewrite rule使用 PHP 更改 .htaccess - 删除重写规则
【发布时间】:2011-08-20 22:26:04
【问题描述】:

一旦页面被删除,我正在使用 PHP 删除/添加静态页面,我希望能够从 .htaccess 中删除它,但是我已经尝试过,但它会引发错误:

警告:preg_replace() [function.preg-replace]: Unknown modifier '' in ...

代码:

$page_name = $row['page_name']; // Example:  help
preg_replace('/RewriteRule ' . preg_quote('^' . $page_name . '/?$ page.php?mode=') . '.*/i', '', $htaccess);

这是一个应该完全删除的示例:

RewriteRule ^help/?$ page.php?mode=help

【问题讨论】:

  • 您希望 100% 确保此脚本非常安全。如果您不小心,允许 PHP 根据任何用户输入修改 .htaccess 可能会导致 anything 出现在其中请确保它不会被滥用。至少,确保它只是您期望的字符、有限的最大长度等......
  • 脚本仅供管理员在制作自定义静态页面时输入,匿名用户不可输入。
  • 如果是这种情况,并且您知道 a) 所有管理员都可以信任并且 b) 您的身份验证/验证/授权机制是防弹的,那么我同意这不是风险。如果可能的话,我仍然很想尝试寻找替代方案 - 但这只是 1 个人的意见 :)
  • 只有 2 个管理员允许访问管理面板。该脚本只允许为新的静态页面添加一个简单的名称,例如feedback - 禁止符号等,所以这里的安全性不是这样,这是我需要解决的问题。但是感谢您的评论:-)

标签: php regex .htaccess alter


【解决方案1】:

您必须通过将表达式分隔符作为第二个参数传递给 preg_quote 来转义表达式分隔符。

preg_replace('/RewriteRule ' . preg_quote('^' . $page_name . '/?$ page.php?mode=', '/') . '.*/i', '', $htaccess);

否则你的 / 不会被转义。如文档中所述“特殊的正则表达式字符是:. \ + * ? [ ^ ] $ ( ) { } = ! | : -”

【讨论】:

    【解决方案2】:

    这样使用

    preg_replace ("~~msi", "pattern to replace")。 另外 - 好的做法是逐行分析 - 一次更改所有文本!!!

    所以

    foreach (file(.htaccess) as $line)
    {

    并在每一行中替换, }

    比全部输出,存储旧 .htaccess 的副本...

    ,阿森

    【讨论】:

    • 对不起。我听不懂你在说什么。你能再澄清一点吗?
    猜你喜欢
    • 2014-02-04
    • 2017-01-07
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多