【发布时间】:2017-02-09 18:13:25
【问题描述】:
我正在尝试使用 .htaccess 从 URL 中隐藏一个子目录。我有一个 PHP 脚本,每次客户端进入网站时都会执行该脚本。它是 Apache 根目录中的 index.php。该脚本确定网站中使用的语言并重定向到目标目录。英语是我的默认语言,所以我需要将 "en" 目录隐藏在 URL 中,同时将所有 URL 请求从根目录重定向到 "en"文件夹,因此它们不会产生 404 HTTP 错误。我通过以下几行部分实现了这一点:
#Remove en/ directory from URL
RewriteRule ^$ en/
#Forward all the requests to en/ directory
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ en/$1
当请求被转发到 "en" 目录时,它会再次显示在 URL 中。这将是流程:
- 用户类型:http://domain.com
- index.php 重定向到http://domain.com/en,因为这是检测到的语言
- .htaccess 规则隐藏 /en 目录,留下 URL http://domain.com
- 客户类型 http://domain.com/panel 以访问他们的用户面板
- .htaccess 重定向到http://domain.com/en/panel
如何删除 "en" 目录,在列表中的最后一个操作之后留下 URL http://domain.com/panel?有没有更好的方法来管理这种行为?
现行规则:
Options -Indexes +FollowSymlinks -MultiViews
ErrorDocument 404 /404.php
RewriteEngine On
RewriteRule ^/?$ en/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^((?!en/).*)$ en/$1 [L,NC]
#Prevent direct access to PHP Scripts
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule \.php$ - [R=404,L]
#Remove WWW
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
【问题讨论】:
标签: regex apache .htaccess redirect mod-rewrite