如何将请求重定向到Apache httpd中的子目录url



我的Linux机箱中运行了Apache httpd服务器,并使用LetsEncrypt启用了SSL。html文件的根目录是/var/www/html。让我在下面展示/var/www/html的结构;

-html
|_ index.php
|_ file1.php
|_ dir1
|  |_ index.php
|_ dir2
|_ index.php

我可以使用https://example.com网址访问该网站。我试图实现的是,如果用户试图访问https://example.com/dir3(不存在),则应该传递根目录的index.php文件。或者,如果用户试图访问https://example.com/dir3/file1.php,则应该传递root的文件file1.php

我尝试在/etc/httpd/conf.d/vhost-le-ssl.conf中编辑虚拟主机,但显示找不到文件。让我在下面描述vhost-le-ssl.conf

<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
ServerAdmin info@example.com
Alias /dir3 "/var/www/html"
<Directory /var/www/html>
AllowOverride None
</Directory>
RewriteEngine on
RewriteEngine on
RewriteCond %{REQUEST_URI} ^/$
RewriteRule dir3/* /var/www/html [R=301]
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
</VirtualHost>
</IfModule>

我该怎么解决这个问题?

作为dir3;不需要的";目录,是已知的,有两种明显的可能性。

1.SymLink文件夹

创建符号链接

ln -s '.' '/var/www/html/dir3'

将使文件夹存在,但显示为/的内容。这有一些含义:

  • 递归:由于dir3本身将再次可见,并启用类似http://example.com/dir3/dir3/dir3/dir3/index.html的URL。这很少是可取的
  • 依赖项:如果/index.html包含依赖于其原始位置的引用,则这些引用可能会失败,具体取决于详细信息

2.重写规则

另一种可能性是使用重写规则。

文件:/var/www/html/.htaccess

RewriteEngine On
RewriteBase "/"
RewriteCond "%{REQUEST_URI}" "^(/dir3)(/.*)"
RewriteRule ".*" "%2" [R=301,NC,L]

R=301告诉发出永久重定向的信号:

  • 重写的位置将在地址栏中可见
  • 搜索引擎将学习新地址作为旧地址的继任者(保持SEO)这在从旧结构迁移到新结构时非常有用
可选:

如果您想对访问者和搜索引擎隐藏重定向,只需省略R=301,:

文件:/var/www/html/.htaccess

RewriteEngine On
RewriteBase "/"
RewriteCond "%{REQUEST_URI}" "^(/dir3)(/.*)"
RewriteRule ".*" "%2" [NC,L]
首选服务器配置时:

如果您有可能编辑Apache的conf文件,并且希望禁用.htaccess-文件的使用,那么您可以在那里通过定义应该应用的文件夹来配置规则:

文件:httpd.confyourVirtualHost.conf

<Directory /var/www/html>
RewriteEngine On
RewriteBase "/"
RewriteCond "%{REQUEST_URI}" "^(/dir3)(/.*)"
RewriteRule ".*" "%2" [R=301,NC,L]
</Directory>

相关内容

  • 没有找到相关文章

最新更新