URL 是如何映射到 Apache 中的?
How is this URL being mapped in Apache?
我接手了一个老开发人员刚刚消失的项目,我的第一个自我分配任务是能够在 EC2 主机上复制整个堆栈。
在原来的预先存在的主机上,我可以点击 URL 即 http://www.example.com/users/login/(我可以去掉尾部的斜杠,它可以很好地点击登录页面)。
查看 /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 的东西,但是回购中只有 2 个 .htaccess 文件,在 httpd.conf 中,我看不出任何地方与 'sections' 有任何关系,所以我不确定在哪里看。
我根目录下的.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/ [R=301,L]
RewriteCond %{HTTP_HOST} ^(.*)example.us [NC]
RewriteRule ^(.*)$ http://%1example.com/ [R=301,L]
RewriteBase /
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [L,R=301]
RewriteRule ^(.*)\.vcf vcf.php [L]
RewriteRule ^shared/(.*)$ / [L,NC,R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Options -Indexes
首先,您可以粘贴 htaccess 文件的内容,以便我们可以看到您已有的规则。我相信你应该有类似
RewriteRule ^([^\.]+)$ .php [NC,L]
此外,一些托管服务提供商(包括据我所知的 AWS EC2)将要求在 apache 配置中启用 MultiViews。
您还可以检查您的 .htaccess 文件是否已被解析和使用(您可以启用重写调试级别或仅在 .htaccess 文件中添加一些伪代码并等待错误 :))。如果 apache 没有加载您的 .htaccess 文件,请检查 AllowOverride 和 Require 设置(您应该拥有 AllowOverride All 和 Require All Granted)。
- 请记住,配置更改将要求您重新加载配置或重新启动 apache 服务。
在这种情况下,RewriteRule 似乎正在将所有请求重写到 index.php 文件。这在框架中很常见,但您可以在没有框架的情况下完成它。在 index.php 文件中,它正在解析查询字符串并将其 re-mapping 到适当的 PHP 文件。
需要注意的是,如果在请求中找不到匹配的文件或目录,它只会重写到 index.php 文件 - 这就是这条规则的作用:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
我接手了一个老开发人员刚刚消失的项目,我的第一个自我分配任务是能够在 EC2 主机上复制整个堆栈。
在原来的预先存在的主机上,我可以点击 URL 即 http://www.example.com/users/login/(我可以去掉尾部的斜杠,它可以很好地点击登录页面)。
查看 /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 的东西,但是回购中只有 2 个 .htaccess 文件,在 httpd.conf 中,我看不出任何地方与 'sections' 有任何关系,所以我不确定在哪里看。
我根目录下的.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/ [R=301,L]
RewriteCond %{HTTP_HOST} ^(.*)example.us [NC]
RewriteRule ^(.*)$ http://%1example.com/ [R=301,L]
RewriteBase /
RewriteEngine On
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/ [L,R=301]
RewriteRule ^(.*)\.vcf vcf.php [L]
RewriteRule ^shared/(.*)$ / [L,NC,R]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Options -Indexes
首先,您可以粘贴 htaccess 文件的内容,以便我们可以看到您已有的规则。我相信你应该有类似
RewriteRule ^([^\.]+)$ .php [NC,L]
此外,一些托管服务提供商(包括据我所知的 AWS EC2)将要求在 apache 配置中启用 MultiViews。
您还可以检查您的 .htaccess 文件是否已被解析和使用(您可以启用重写调试级别或仅在 .htaccess 文件中添加一些伪代码并等待错误 :))。如果 apache 没有加载您的 .htaccess 文件,请检查 AllowOverride 和 Require 设置(您应该拥有 AllowOverride All 和 Require All Granted)。
- 请记住,配置更改将要求您重新加载配置或重新启动 apache 服务。
在这种情况下,RewriteRule 似乎正在将所有请求重写到 index.php 文件。这在框架中很常见,但您可以在没有框架的情况下完成它。在 index.php 文件中,它正在解析查询字符串并将其 re-mapping 到适当的 PHP 文件。
需要注意的是,如果在请求中找不到匹配的文件或目录,它只会重写到 index.php 文件 - 这就是这条规则的作用:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d