这个 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 中是如何映射的?的主要内容,如果未能解决你的问题,请参考以下文章