这个 URL 在 Apache 中是如何映射的?

Posted

技术标签:

【中文标题】这个 URL 在 Apache 中是如何映射的?【英文标题】:How is this URL being mapped in Apache? 【发布时间】:2016-04-21 21:01:45 【问题描述】:

我接手了一个老开发人员刚刚消失的项目,我自己分配的第一个任务是能够在 EC2 主机上复制整个堆栈。

在原来的预先存在的主机上,我可以点击http://www.example.com/users/login/ 的 URL(我可以去掉尾部的斜杠,它就可以点击登录页面)。

查看/var/www/[example.com]/ 中的源代码——我可以找到一个sections/users/login.php,它看起来像是html 页面的呈现位置。

我的辅助 EC2 主机中有相同的代码,但是我不想使用虚拟主机,我只是将它放在 /var/www/html/ 中(而不是 /var/www/[example. com]/),但我得到的是 404。

我应该在哪里寻找将http://www.example.com/users/login/ 指向/sections/users/login.php 的映射?

我对 RewriteRule 的东西不是很熟悉,但是 repo 和 httpd.conf 中仅有的 2 个 .htaccess 文件,我看不到任何地方与“部分”有关,所以我不确定在哪里看。

我根目录下的 .htaccess 是:

php_value post_max_size 1024M
php_value upload_max_filesize 1024M
php_value memory_limit 1024M
php_value max_input_time 1800
php_value max_execution_time 1900
php_value session.gc_maxlifetime 7200

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %HTTP_HOST ^(.*)example.mobi [NC]
    RewriteRule ^(.*)$ http://%1example.com/$1 [R=301,L]

    RewriteCond %HTTP_HOST ^(.*)example.us [NC]
    RewriteRule ^(.*)$ http://%1example.com/$1 [R=301,L]

    RewriteBase /

    RewriteEngine On
    RewriteCond %HTTP_HOST ^[^.]+\.[^.]+$
    RewriteRule ^(.*)$ http://www.%HTTP_HOST/$1 [L,R=301]

    RewriteRule ^(.*)\.vcf vcf.php [L]

    RewriteRule ^shared/(.*)$ /$1 [L,NC,R]

    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule . /index.php [L]
</IfModule>

Options -Indexes

【问题讨论】:

当前.htaccess文件的内容是什么?如果它将所有内容都重写到 index.php 文件,那么它就是 index.php 中的东西,它正在路由 URL。 @ChrisBanks -- 我添加了 .htaccess 文件。这些规则之一是否在执行您建议的重写?最后一条规则没有这样做……是吗? 是的。该网站是否使用任何类型的框架?只需查看 index.php 的内部,无论是在那里还是在另一个文件中,它都在解析查询字符串并将其重新映射到您提到的文件 不,没有 CakePHP 或任何框架,但我知道包含在哪里发生。现在我看到 .htaccess 只是没有在我试图模拟原始设置的辅助服务器上被读取,所以......这是我的问题。我想我现在需要弄清楚,谢谢! 您的评论和卢锡安的回答帮助我解决了问题。 【参考方案1】:

首先,您可以粘贴 htaccess 文件的内容,以便我们查看您已有的规则。我相信你应该有类似的东西

RewriteRule ^([^\.]+)$ $1.php [NC,L]

此外,一些托管服务提供商(包括我所知道的 AWS EC2)将要求在 apache 配置中启用 MultiViews。

您还可以检查您的 .htaccess 文件是否已被解析和使用(您可以启用重写调试级别或只是在 .htaccess 文件中添加一些虚拟代码并等待错误:))。如果 apache 没有加载您的 .htaccess 文件,请检查 AllowOverride 和 Require 设置(您应该允许 AllowOverride All 和 Require All Granted)。

请记住,配置更改将要求您重新加载配置或重新启动 apache 服务。

【讨论】:

【参考方案2】:

在这种情况下,RewriteRule 似乎正在将所有请求重写到 index.php 文件。这在框架中很常见,但您可以在没有框架的情况下完成它。在 index.php 文件中,它解析查询字符串并将其重新映射到适当的 PHP 文件。

需要注意的是,如果在请求中没有找到匹配的文件或目录,它只会重写 index.php 文件——这就是这条规则的作用:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d

【讨论】:

以上是关于这个 URL 在 Apache 中是如何映射的?的主要内容,如果未能解决你的问题,请参考以下文章

Apache spark如何计算分区以及在executor中如何处理分区

Apache HTTP Server 映射URL到文件系统

urlMappings与URL映射

如何用 web.xml 映射 Html 文件?

如何映射组合键

Restkit — 如何用可变键名映射 json 对象