我的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.conf
或yourVirtualHost.conf
<Directory /var/www/html>
RewriteEngine On
RewriteBase "/"
RewriteCond "%{REQUEST_URI}" "^(/dir3)(/.*)"
RewriteRule ".*" "%2" [R=301,NC,L]
</Directory>