【问题标题】:How is this URL being mapped in Apache?这个 URL 在 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 只是没有在我试图模拟原始设置的辅助服务器上被读取,所以......这是我的问题。我想我现在需要弄清楚,谢谢!
  • 您的评论和卢锡安的回答帮助我解决了问题。

标签: php apache .htaccess mod-rewrite httpd.conf


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-22
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2021-07-17
      • 2021-07-12
      • 1970-01-01
      相关资源
      最近更新 更多