我在我的开发机器上使用 mod_rewrite 设置 Apache 时遇到问题。Mod_rewrite 处于活动状态,并且适用于某些规则。某些规则无法按预期工作,例如:
RewriteRule ^static/([^/]+)/([^/]+) /static.php?sISOCode=$1&sPage=$2
Run Code Online (Sandbox Code Playgroud)
在 static.php 中,我这样做(用于调试):
<?php
print_r($_GET); print_r($_POST); print_r($_SERVER); die();
Run Code Online (Sandbox Code Playgroud)
其中打印(从 $_SERVER 数组中删除了一些项目):
Array
(
)
Array
(
)
Array
(
[SERVER_SIGNATURE] => <address>Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch Server at alpha.prove.no Port 80</address>
[SERVER_SOFTWARE] => Apache/2.2.11 (Ubuntu) PHP/5.2.6-3ubuntu4.1 with Suhosin-Patch
[SERVER_ADDR] => 127.0.0.1
[SERVER_PORT] => 80
[REMOTE_ADDR] => 127.0.0.1
[DOCUMENT_ROOT] => /home/veg/workspace/project
[SERVER_ADMIN] => webmaster@localhost
[SCRIPT_FILENAME] => /home/veg/workspace/project/static.php
[REMOTE_PORT] => 38954
[GATEWAY_INTERFACE] => CGI/1.1
[SERVER_PROTOCOL] => HTTP/1.1
[REQUEST_METHOD] => GET
[QUERY_STRING] =>
[REQUEST_URI] …Run Code Online (Sandbox Code Playgroud) 网址采用这些形式的 MVC 系统如何通过单个 index.php 文件强制所有请求?
http://www.example.com/foo/bar/baz
http://www.example.com/goo/car/caz/SEO-friendly-name-of-the-object
http://www.example.com/hey/you
Run Code Online (Sandbox Code Playgroud)
编辑:当我尝试下面的重写规则时,出现此错误:
[error] [client 127.0.0.1] Invalid URI in request GET / HTTP/1.1
[error] [client 127.0.0.1] Invalid URI in request GET /abc HTTP/1.1
Run Code Online (Sandbox Code Playgroud)
编辑:哦,这是/index.php 的完整内容。当我删除重写规则时,它会输出 '/' 或 '/index.php' 或者我得到 404 其他任何东西。
<?php
echo htmlspecialchars($_SERVER['REQUEST_URI']);
?>
Run Code Online (Sandbox Code Playgroud)
已解决:我在重写规则中的 index.php 前面添加了一个 / ,然后它起作用了:
再次解决:结果 / 只需要,因为我运行的是 2.2.4。当我升级到 2.2.11 时,不再需要 /。
从的输出phpinfo(),--disable-dom都包括在配置命令。如何在--enable-dom不重新编译 PHP 的情况下将其更改为?
编辑:我使用的是 Fedora 10。我使用的 PHP 是它附带的。
我在这台服务器上运行 Ubuntu 8.04。我通过包管理器安装了 PHP 5.2。我将其删除以手动安装 PHP 5.3.1。我像这样构建了包
./configure --prefix=/opt/php --with-mysql --with-curl=/usr/bin --with-apxs2=/usr/bin/apxs2
make
make install
Run Code Online (Sandbox Code Playgroud)
这在 /opt/php/ 中安装了 PHP 5.3.1
$ php -v
PHP 5.3.1 (cli) (built: Dec 7 2009 10:51:14)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试启动 Apache 时,我得到了这个。
# /etc/init.d/apache2 restart
* Restarting web server apache2
apache2: Syntax error on line 185 of /etc/apache2/apache2.conf:
Syntax error on line 1 of /etc/apache2/mods-enabled/php5.load:
Cannot load /usr/lib/apache2/modules/libphp5.so into server:
/usr/lib/apache2/modules/libphp5.so: undefined symbol: OnUpdateLong …Run Code Online (Sandbox Code Playgroud) 我有一个使用 PHP 会话进行身份验证的站点。有一个我想限制访问的目录,它不使用任何 PHP,它只是充满了静态内容。
我只是不知道如何在没有每个请求都通过 PHP 脚本的情况下限制访问。有什么方法可以让 Apache 检查会话凭据并限制访问,如基本身份验证?
有什么方法可以让我找到发送电子邮件的 php 脚本。
我在“标准”安装中有 apache+php(没有 mod_suphp 也没有 suexec),我想找出女巫 php 脚本正在发送电子邮件,当我检查日志时,我只看到发送电子邮件的用户的 uid(在我的情况 apache ),但我想找出源自电子邮件的脚本。
是否有可能或者我必须安装 suexec 或 mod_suphp 来跟踪它?
感谢您的帮助。
我正在将几个 Wordpress 博客迁移到 AWS,但遇到了文件权限问题,该问题在过去几个小时内成功阻止了我。
最简单的 fopen 调用总是失败,并显示“无法打开流:权限被拒绝”:
<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>
Run Code Online (Sandbox Code Playgroud)
我已经尝试/检查了以下内容
有什么我错过的可能会导致这种情况吗?我怀疑我已经盯着这个看了很长时间,我错过了一些明显的东西。
更新:在应用了womble 的建议后,我开始认为这个问题不仅仅是错误的权限或 PHP 配置错误。我确实设法让上面的代码写出一个文件,但是即使使用正确的用户和组执行 PHP 脚本,生成的文件所有权和组也被设置为 apache 的所有权和组。如果我从命令行执行相同的测试脚本,则发出的文件具有正确的权限。这让我相信这是我使用 mod_suexec 的问题。
编辑:我对getmyuid()和getmygid()的使用不正确,因为它们只返回脚本文件的用户和组,而不是它运行的权限。更正确的方法是使用像这样的 comething:
<?php echo exec('ps -up '.getmypid()); ?>
Run Code Online (Sandbox Code Playgroud) 我正在尝试重定向没有 www 的 url。到 www.version(example.com 到 www.example.com)。我用通常的
RewriteCond %{HTTP_HOST} ^example\.com [nc]
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Run Code Online (Sandbox Code Playgroud)
这适用于我所有的其他项目。但是,在这个特定站点上,它以重定向循环结束。这是奇怪的部分:我试图卷曲非 www 版本以查看它使用
curl --get http://example.com --dump-header domain.header > domain.html. 头文件如下所示:
HTTP/1.1 301 Moved Permanently
Date: Mon, 06 Jun 2011 14:45:16 GMT
Server: Apache/2.2.16 (Debian)
Location: http://example.com/
Vary: Accept-Encoding
Content-Length: 310
Content-Type: text/html; charset=iso-8859-1
Run Code Online (Sandbox Code Playgroud)
但是,生成的 HTML 文件是这样的:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="http://www.example.com/">here</a>.</p>
<hr>
<address>Apache/2.2.16 (Debian) Server at example.com Port 80</address> …Run Code Online (Sandbox Code Playgroud) 我对 Web 开发比较陌生,所以请耐心等待。
我主要是 iPhone 开发人员,但最近使用共享主机为其他人创建了一个站点。我可以在该站点上用 PHP 写入文件,而无需考虑权限。
我正在为我正在制作的新应用程序部署 Web 服务,但进展并不顺利。这里最重要的区别是我使用的是其他人的服务器,并且只有 FTP/DB 访问权限。
基本上,我有很多 PHP 文件构成了我的 CMS,如下所示:
mysite.com/admin/manage_news.php
mysite.com/admin/manage_events.php
Run Code Online (Sandbox Code Playgroud)
然后这些脚本编辑数据库或文件。他们可以很好地与数据库交互,但是,我的脚本无法写入文件系统。例如,他们可能会尝试写入以下文件:
mysite.com/data/img/event_1.png
mysite.com/data/somefile.txt
Run Code Online (Sandbox Code Playgroud)
这在我的 MAMP 安装(本地)上运行良好,但是一旦部署到服务器,每次尝试写入时 PHP 都会出现错误......
无法打开文件“../data/img/someimage.png”进行写入。
所以我给运行服务器的人发了电子邮件,他回来说:
它在公共许可下工作吗?(777)
而且,确实如此 - 但我对使用公共权限非常谨慎,因此立即再次禁用它。我给他发邮件说“我怎样才能让我的 PHP 脚本使用标准用户权限来编写”,他说:
把它公开,就没事了
我认为这是域解析中某处的 ip 冲突,但我并不担心。
然后我给他发电子邮件说“这肯定是不安全的”或类似的话,他回复如下:
现实情况是,有数百万个网站,包括我管理的几个网站,它们在各种文件夹中都有 777 个,这只是一种生活方式。
谁能给我一些我可以给他的解决方案的想法?或者我可以做些什么来避免使用 777?我真的不喜欢我的网站/服务上的任何文件夹都可以公开写入的想法。
我非常感谢您的建议,因为我对 Web 服务器知之甚少。
我编写了一个脚本来在 Nginx 上创建新的虚拟主机。该脚本创建 Ningx vhost 配置文件、vhost 用户和目录、php-fpm 池文件。
在脚本的末尾,我想在重新启动 php-fpm 之前检查配置是否正常。对于 Apache,我可以apachectl graceful,但是可以用 做类似的事情php5-fpm -t吗?
php ×10
apache-2.2 ×8
mod-rewrite ×3
.htaccess ×1
bash ×1
email ×1
http-headers ×1
mvc ×1
permissions ×1
php-fpm ×1
rewrite ×1
scripting ×1
suexec ×1
vps ×1