我有一个位于共享主机上的PHPnetworking应用程序。 我的目标是在PHP页面运行时从PHP代码中修改.htaccess文件。 我需要.htaccess插入一些mod_rewrite行到它。
问题是,在Windows + Apache上,我可以dynamic修改.htaccess文件,但是当我尝试以任何方式访问这个文件(复制或打开)时,Linux上相同的代码报告了一个问题:
"failed to open stream: Permission denied"
我给了.htaccess文件777权限 – 仍然没有结果。 什么阻止我这样做? 我如何开发一个解决方法?
PS我最初的目标是能够添加一个新的RewriteRule到.htaccess映射新的category_id与新的category_name。
如果它不是共享主机,我会使用像RewriteMap(在主Apacheconfiguration),并将能够访问地图文件。
这是我用PHP + Apache无法解决的第一个真正的限制,但是我希望这也是可以避免的。
我想建议其他的东西也可以。 为什么不为每一个“特殊”的网址写一条规则呢?
我发现使用WordPress的用法变得简单很多:每个URL都被重定向到索引。
你所要做的就是设置索引文件,读入被加载的目录(也许使用$ _SERVER ['URI_REQUEST'])并处理它。
添加到.htaccess这个:
<Ifmodulee mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </Ifmodulee>
多亏了这个chunck,你有一个系统在某种程度上是无限的。 如果您想重命名类别URL,或者添加其他特例,则已经准备就绪!
这似乎是一个过于复杂的解决方案,只是有一个通用的“加载类别”页面,从URL中取得类别名称并加载相应的ID。
例如,如果URL是:
http://yoursite.com/category/programming
我会重映像这样的:
http://yoursite.com/category.php?name=programming
你只需要一小部分重写规则。 要做乍得的建议:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/category/.*$ category.php [QSA]
因此,任何时候有人导航到/category/category_id
,请求将被引导到category.php
,这将被交给$_SERVER['REQUEST_URI']
的/category/
URI,从中你可以很容易地获得类别ID,每次添加类别时,不需要费心编辑.htaccess文件。
虽然我同意上面的意见,但绝对可以做到。 像WordPress这样的PHP应用程序正是基于设置页面所做的更改来完成的。 它应该像写入文件一样简单,但是父目录NEEDS要有Web服务器用户写入的权限。
如果它没有为你工作的技巧将使父目录777或775,并将组设置为Apache下运行的任何组(通常是“apache”或“www”或类似的东西)
亚当(评论你的问题)是非常正确的,但你的服务器上的其他安全层可能会阻止你这样做,这可能是一个很好的迹象表明,你可能正在接近错误的方式。
我同意乍得桦树。 如果你不能劝阻,但在你的情况下,我会首先寻找具有锁定权限的父目录。
仅供参考,重写.htaccess的原因之一是一个坏主意,因为在.htaccess正在被重写的任何请求将不会被应用任何重定向。