标签: php

mod_rewrite 不转发 GET 参数

我在我的开发机器上使用 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)

php mod-rewrite rewrite apache-2.2

9
推荐指数
1
解决办法
7710
查看次数

如何让所有 URL 都通过一个 PHP 文件运行?

网址采用这些形式的 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 时,不再需要 /。

php mod-rewrite mvc apache-2.2

9
推荐指数
1
解决办法
1万
查看次数

如何在不重新编译 PHP 的情况下启用-dom?

从的输出phpinfo(),--disable-dom都包括在配置命令。如何在--enable-dom不重新编译 PHP 的情况下将其更改为?

编辑:我使用的是 Fedora 10。我使用的 PHP 是它附带的。

php

9
推荐指数
1
解决办法
5万
查看次数

PHP 5.3.1 未定义符号:Apache 启动时出现 OnUpdateLong 错误

我在这台服务器上运行 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 apache-2.2

9
推荐指数
2
解决办法
2万
查看次数

如何使用 PHP 会话保护 Apache 中的目录

我有一个使用 PHP 会话进行身份验证的站点。有一个我想限制访问的目录,它不使用任何 PHP,它只是充满了静态内容。

我只是不知道如何在没有每个请求都通过 PHP 脚本的情况下限制访问。有什么方法可以让 Apache 检查会话凭据并限制访问,如基本身份验证?

php authentication apache-2.2

9
推荐指数
2
解决办法
2万
查看次数

找到发送邮件的php脚本

有什么方法可以让我找到发送电子邮件的 php 脚本。

我在“标准”安装中有 apache+php(没有 mod_suphp 也没有 suexec),我想找出女巫 php 脚本正在发送电子邮件,当我检查日志时,我只看到发送电子邮件的用户的 uid(在我的情况 apache ),但我想找出源自电子邮件的脚本。

是否有可能或者我必须安装 suexec 或 mod_suphp 来跟踪它?

感谢您的帮助。

email php apache-2.2

9
推荐指数
1
解决办法
9596
查看次数

PHP fopen 总是因权限被拒绝而失败

我正在将几个 Wordpress 博客迁移到 AWS,但遇到了文件权限问题,该问题在过去几个小时内成功阻止了我。

最简单的 fopen 调用总是失败,并显示“无法打开流:权限被拒绝”:

<?php $handle = fopen('test.txt', 'w') or die('Can\'t open file'); ?>
Run Code Online (Sandbox Code Playgroud)

我已经尝试/检查了以下内容

  • 我正在写入的目录具有正确的文件权限 (755) 和正确的所有权。一直到 /home 的路径都是如此。
  • 我正在编写由getcwd()确认的正确目录
  • 测试 PHP 脚本散列与我尝试写入的路径相同的所有权并更正权限 (644)。
  • 我正在运行 mod_suexec 以确保使用与我写入的路径相同的用户和组来执行脚本。函数getmyuid()和getmygid()返回正确的用户和组 ID(编辑:这是错误的,见下文)。
  • PHP 安全模式在 php.ini 中被禁用。
  • fopen 不是不允许的 PHP 函数。
  • 禁用open_basedir的使用。

有什么我错过的可能会导致这种情况吗?我怀疑我已经盯着这个看了很长时间,我错过了一些明显的东西。

更新:在应用了womble 的建议后,我开始认为这个问题不仅仅是错误的权限或 PHP 配置错误。我确实设法让上面的代码写出一个文件,但是即使使用正确的用户和组执行 PHP 脚本,生成的文件所有权和组也被设置为 apache 的所有权和组。如果我从命令行执行相同的测试脚本,则发出的文件具有正确的权限。这让我相信这是我使用 mod_suexec 的问题。

编辑:我对getmyuid()和getmygid()的使用不正确,因为它们只返回脚本文件的用户和组,而不是它运行的权限。更正确的方法是使用像这样的 comething:

<?php echo exec('ps -up '.getmypid()); ?>
Run Code Online (Sandbox Code Playgroud)

php suexec apache-2.2

9
推荐指数
2
解决办法
3万
查看次数

.htaccess 无法正确重定向到以 www 为前缀的页面

我正在尝试重定向没有 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)

php mod-rewrite .htaccess http-headers apache-2.2

9
推荐指数
1
解决办法
1838
查看次数

我的服务器管理员希望我对目录设置公共写入权限

我对 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 服务器知之甚少。

php permissions vps file-permissions apache-2.2

9
推荐指数
2
解决办法
732
查看次数

php5-fpm:用于在重启前检查配置的 bash 脚本

我编写了一个脚本来在 Nginx 上创建新的虚拟主机。该脚本创建 Ningx vhost 配置文件、vhost 用户和目录、php-fpm 池文件。

在脚本的末尾,我想在重新启动 php-fpm 之前检查配置是否正常。对于 Apache,我可以apachectl graceful,但是可以用 做类似的事情php5-fpm -t吗?

scripting php bash php-fpm

9
推荐指数
1
解决办法
2万
查看次数