Apache 2.4 .htaccess - 将所有请求指向index.html,只有一个异常

时间:2017-10-02 22:41:04

标签: apache .htaccess apache2 httpd.conf apache2.4

我目前有以下DatabaseQuery

.htaccess

Web服务器的文档根目前是上面引用的<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> 文件夹(/production文件位于父文件夹中,因为.htaccess被删除并重建代码提交)。以上内容会将我网站的所有流量都指向/production

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

要查看,这是我的script.php目录:

/var/www/html

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

1 个答案:

答案 0 :(得分:0)

  

Apache指向/var/www/html/production

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

不幸的是,您无法使用.htaccess重写文档根目录上的文件(无论.htaccess文件位于何处)。这是因为每个目录RewriteRule文件中的.htaccess 替换采用网址路径,因此尝试重写为文档上方的网址root根本就是无效的。但是,如果您有权访问服务器配置(或虚拟主机),则可以使用此方法重写为文件系统路径(包括文档根目录上方) - 而不是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(位于文档根目录下方) - 就像您当前的那样文件系统结构。

顺便提一下,RewriteBase /production/文件中的.htaccess指令完全是多余的。您还没有使用相对路径替换,但由于/production文档根,因此/index.html(文档根相对URL路径)将重写为{{1无论如何。

但是,如果您可以直接在服务器配置(或虚拟主机)中编写此代码,那么您可以执行所需的操作。例如:

/production/index.html