Apache 2.4 .htaccess - 将所有请求指向 index.html,但有一个例外

Posted

技术标签:

【中文标题】Apache 2.4 .htaccess - 将所有请求指向 index.html,但有一个例外【英文标题】:Apache 2.4 .htaccess - Point All Requests to index.html With One Exception 【发布时间】:2018-03-14 01:39:16 【问题描述】:

我目前有以下.htaccess

<IfModule mod_rewrite.c>
    Options Indexes FollowSymLinks
    RewriteEngine On
    RewriteBase /production/
    RewriteRule ^index\.html$ - [L]
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule . /index.html [L]
</IfModule>

Web 服务器的文档根目录当前是上面引用的/production 文件夹(.htaccess 文件位于父文件夹中,因为每次代码提交都会删除并重建/production)。以上将把我网站的所有流量导向index.html

我想对此例外。如果请求是www.mydomain.com/specialrequest,我希望在父文件夹中运行一个名为script.php 的PHP 脚本。

回顾一下,这是我的/var/www/html 目录:

-html
    -production
    -anotherfolder
    -.htaccess
    -script.php

Apache 指向 /var/www/html/production,我希望所有请求都转到该目录中的 index.html 文件,除非请求是 /specialrequest - 在这种情况下,我希望 script.php 运行。

【问题讨论】:

【参考方案1】:

Apache 指向/var/www/html/production

所以,/var/www/html/production 确实被定义为DocumentRoot。因此,您的.htaccess 文件位于文档根目录的上方。并且您要重写的文件(在收到此特殊请求后)也在文档根目录之上。

不幸的是,您无法使用.htaccess 重写到文档根目录上方的文件(无论该.htaccess 文件位于何处)。这是因为每个目录 .htaccess 文件中的 RewriteRule substitution 采用 URL-path,因此尝试重写到文档根目录上方的 URL 根本无效.但是,如果您有权访问服务器配置(或虚拟主机),那么您可以使用此方法重写到 文件系统路径(包括文档根目录之上)——而不是 URL 路径。

因此,script.php 需要位于文档根目录中才能使用.htaccess 执行此操作。在这种情况下,您可以执行以下操作:

RewriteEngine On

# Exception
RewriteRule ^specialrequest$ /script.php [L]

# Front controller
RewriteRule ^index\.html$ - [L]
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.html [L]

但在这种情况下,script.php 需要位于 /html/production/script.php(在文档根目录中),而不是在 /html/script.php(在文档根目录之上) - 就像在您当前的文件系统结构中一样。

顺便说一句,.htaccess 文件中的 RewriteBase /production/ 指令完全是多余的。无论如何您都没有使用相对路径替换,但由于/production文档根,那么/index.html(文档根相对URL 路径)无论如何都会重写为/production/index.html


但是,如果您可以直接在服务器配置(或虚拟主机)中编写它,那么您可以做您需要的事情。例如:

RewriteEngine On

# Rewrite to filesystem path (in the server config)
RewriteRule ^/specialrequest$ /var/www/html/script.php [L]

# Front controller
RewriteRule ^/index\.html$ - [L]
RewriteCond %LA-U:REQUEST_FILENAME !-f
RewriteCond %LA-U:REQUEST_FILENAME !-d
RewriteRule ^/. /index.html [L]

【讨论】:

以上是关于Apache 2.4 .htaccess - 将所有请求指向 index.html,但有一个例外的主要内容,如果未能解决你的问题,请参考以下文章

apache_conf .htaccess nach Umstellung auf Apache 2.4

Apache 2.4 .htaccess - 将所有请求指向 index.html,但有一个例外

apache 2.4中的htaccess重定向301不起作用

.htaccess for apache 2.2 不适用于 apache 2.4 vagrant 开发框

基于 IP 的 Apache 2.4 mod_authz_host 使用 htaccess 启用索引(文件夹视图)

Apache 升级 2.2 -> 2.4 问题