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 开发框