我正在清理和重新整理服务器上的文件(基本共享托管情况),并正在深入研究 .htaccess 以进行此操作。我正在将 Web 根目录中的内容移动到 /design/v5/ 的子目录中,并尝试使用 RewriteRule 和 RedirectMatch 使以下两种方案发挥作用:
#-------------------------
#Redirect root url to subdirectory
# 1. Visits: DOMAIN.TLD/*
# Served: DOMAIN.TLD/design/v5/*
#
# 2. Visits: DOMAIN.TLD/design/v5/*
# Redirected: DOMAIN.TLD/*
#-------------------------
RewriteRule ^/(.*)$ /design/v5/$1 [L,R]
RedirectMatch 301 ^/design/v5/(.*)$ /(.*)$1
正如各位 Apache 专业人士所看到的,我把一些东西搞得一团糟,但却不知道在哪里以及如何搞砸了(目前,我正在阅读这里和其他网站上的类似问题的大量参考资料……我们这些设计师/前端人员可能相当愚钝)。
此外,我还想在这里完成两件事:
- 在我的编码中维护相对 URL
- 让重定向/重写级联到 /design/v5/ 自己的子目录中。
- 如果我可以将这些子目录分组放在括号中,如 (includes|img|scripts|style),或者让所有内容使用通配符,而不是写出单独的 ReWrite/Redirect 规则集,那就太棒了。
- 不会对其他子目录产生重写效果(即 DOMAIN.TLD/lawlz/imonaboat.gif 仍将按书面形式工作,并且不会从 /design/v5/ 定向)。
到目前为止,通过摆弄我的基本设置,我得到了以下三种结果之一:
- 我的网站根目录的空白索引目录列表,
- 我的网站根目录下的服务器错误页面,
- 来自 Web 根目录的损坏版本的浏览器错误页面:http://域名.tld/(。)/(.)/(.)/(.)/(.)/(.)...
深夜更新:
这个 SO 答案在根级别上完美运行,但是不会从子目录重定向[当我导航到 DOMAIN.TLD/design/v5 时,我会重定向到 DOMAIN.TLD/(.*)],并且会由于繁重的重写规则而破坏任何非子域名的目录。
RewriteCond %{THE_REQUEST} ^GET\ /design/comingsoon/
RewriteRule ^design/comingsoon/(.*) /$1 [L,R=301]
RewriteRule !^design/comingsoon/ design/comingsoon%{REQUEST_URI} [L]
答案1
! 在重写规则中是不允许的。
RewriteCond %{THE_REQUEST} ^GET\ /design/comingsoon/
RewriteRule ^design/comingsoon/(.*) /$1 [L,R=301]
RewriteRule ^design/comingsoon/ - [L]
#rewrite to '-' doesn't do anything, but with the L flag the rule(s) below it will never be applied
RewriteRule (.*) design/comingsoon/$1 [L]