0

我在三台不同的计算机上安装了三台 Web 服务器。我正在尝试安装一个 php 应用程序,它将所有 url 请求重写为 index.php(前端控制器模式)。以下 .htaccess 适用于三个 Web 服务器中的两个:

RewriteEngine On
# Redirect everything to the Front Controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(css|images|files)/ index.php [NC,L]

因此,当我访问时http://example.com/hithere,会调用 index.php,然后我可以解析最初请求的 url ( hithere) 以确定将其发送到哪个控制器。

但是,由于某些未知原因,上述 .htaccess 文件在第三个网络服务器上不起作用。相反,当我访问时http://example.com/hithere,我的浏览器中出现 404 not found 错误,上面写着:

The requested URL /full/path/to/application/index.php was not found on this server.

因此,基于上述错误,我可以看出它实际上是在尝试重定向到 index.php。但是浏览器在/full/path/...下面列出的文件实际上在我的网络服务器上 - 所以我不知道为什么它找不到它。有人可以帮助我并告诉我我做错了什么吗?

编辑:我不知道 httpd.conf 中的某些内容是否存在冲突,但这里是我在 httpd.conf 中针对此应用程序所在目录的设置

Alias /myapp /full/path/to/my/app
<Directory /full/path/to/my/app>
Order allow,deny
AllowOverride All
Allow from all
</Directory>

编辑 2:我注意到 Apache 日志中有一些特殊的东西。看起来 Apache 正在将我试图将流量重定向到的 index.php 附加到 DocumentRoot:

File does not exist: /document/root/full/path/to/my/app/index.php

什么时候应该去:

/full/path/to/my/app/index.php

所以我基本上需要告诉 htaccess 忽略文档根目录。我通过在我的 .htaccess 文件中指定这个来尝试这个:

RewriteBase /full/path/to/my/app/

但它仍在为 index.php 搜索文档根目录:/ 有没有办法重置 DocumentRoot 或告诉 htaccess 在重写 index.php 时忽略它?即使我在 RewriteRule 中使用绝对路径,它仍然会将其附加到文档根目录。

RewriteEngine On
# Redirect everything to the Front Controller
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^(css|images|files)/ /full/path/to/my/app/index.php [NC,L]

这对我来说没有意义......有人可以帮忙吗?

谢谢

4

3 回答 3

0

您还需要检查在文件DocumentRoot中查找类似内容的参数httpd.conf 并确保其正确。这也是 apache 从中获取它的地方。

DocumentRoot "/var/www/html/path/to/whatever"

SELinux此外,如果它打开并且你真的不需要它,我也会禁用它,因为它也会导致奇怪的问题。

于 2013-06-25T21:57:05.000 回答
0

因此,基于上述错误,我可以看出它实际上是在尝试重定向到 index.php。但是浏览器在下面的 /full/path/... 中列出的文件实际上是在我的网络服务器上 - 所以我不知道为什么它找不到它。

假设它是一个类似 *nix 的系统,您可能需要检查文件权限并确保网络服务器具有对该文件的读取权限。

于 2013-06-25T19:15:52.373 回答
0

首先通过使用在 apache 中启用重写模块,然后通过 将以下代码放入您的虚拟主机中$ sudo a2enmod rewrite重新启动 Web 服务器。$ sudo systemctl restart apache2

<Directory /var/www/html/your_app_folder>
    Order allow,deny
    AllowOverride All
    Allow from all
</Directory>

.htaccess然后在您的文件中添加以下代码

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L] 
</IfModule>
于 2020-02-06T05:02:53.250 回答