2

在我的“public_html”目录中,我有以下结构:

- root
  - index.html
  - blog
    - index.html
- lab
  - index.html
- wp
  - (WORDPRESS FILES)

“lab”和“wp”目录只是工作正常的子域目录(“ http://lab.tomblanchard.co.uk ”和“ http://wp.tomblanchard.co.uk ”)。

基本上我希望主域(“ http://tomblanchard.co.uk ”)指向“根”目录而不进行任何实际重定向,例如,我希望“ http://tomblanchard.co.uk ”指向到“root”目录中的“index.html”文件,我希望“ http://tomblanchard.co.uk/blog ”指向“root/blog”目录中的“index.html”文件等等上。

我在“.htaccess”文件中使用以下代码实现了这一点:

#  Add directives
RewriteEngine on

#  Remove ".html" extension from URLs
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

#  Change root directory to "root" folder
Options +FollowSymLinks
RewriteCond %{REQUEST_URI} !(.*)root 
RewriteRule ^(.*)$ root/$1 [L]

唯一的问题是像“ http://tomblanchard.co.uk/root/ ”和“ http://tomblanchard.co.uk/root/blog/ ”这样的东西仍然可以工作,而实际上他们甚至不应该能够被访问(404)。

如果有人对如何排序或有更强大的方法有任何想法,将不胜感激。

更新

经过数小时的研究,终于让它按我想要的方式工作,我使用了以下内容:

#  Add directives
RewriteEngine on

#  Change root directory to "root" folder
RewriteCond %{THE_REQUEST} ^GET\ /root/
RewriteRule ^root/(.*) /$1 [L,R=301]
RewriteRule !^root/ root%{REQUEST_URI} [L]
4

2 回答 2

1

mod_rewrite 中指令的顺序很重要,因为每个规则都将前一个规则的输出视为其要测试的输入。您需要按顺序做 3 件(或可能 4 件)事情:

  1. 拒绝访问任何开头的 URL /root/(我们必须先这样做,否则一切都会被拒绝!)
  2. 确保每个 URL 只有一个有效格式通常是一种很好的做法,因此指定的 URL应该.html导致浏览器重定向到非.html格式。这需要在其他重写之前发生,否则您无法区分浏览器中的 .html 和虚拟添加的 .html。
  3. 在目录中查找上面没有被拒绝的任何 URL /root/,而不是配置的DocumentRoot
  4. .html如果该文件存在,则查找任何不指向 URL + 下目录的 URL 。这必须其他重写之后进行,否则“文件存在”检查将始终失败。
#  General directives
Options +FollowSymLinks
RewriteEngine on

# Deny URLs beginning /root/, faking them as a 404 Not Found
RewriteRule ^root/ [R=404]

# Additional rule to strip .html off URLs in the browser
RewriteRule ^(.*)\.html$ $1 [R=permanent,L]

# Rewrite everything remaining to the /root sub-directory
# (Host condition was in your post originally, then edited out; this is where it would go)
RewriteCond %{HTTP_HOST} ^(www\.)?tomblanchard\.co\.uk$
RewriteRule ^(.*)$ root/$1

# Handle "missing" ".html" extension from URLs
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

PS:请注意我描述(内部)重写的谨慎语言,而不是(浏览器)重定向:您拥有的规则不是从任何内容中删除,而是添加 它,因此如果其他人删除它,则允许访问页面。由于您经常在一组规则中同时修改这两者,因此重要的是要清楚地了解浏览器请求的 URL 和 Apache 最终将提供的虚拟 URL 之间的区别。.html

于 2013-07-07T15:13:00.050 回答
0

您没有定义任何规则来阻止/root地址,那么当没有什么可做的时候,您想如何阻止它?

尝试这个:

#  Add directives
RewriteEngine on

RewriteCond %{REQUEST_URI} .root [NC]
RewriteRule (.*) / [L,R=404]

#  Remove ".html" extension from URLs
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

#  Change root directory to "root" folder
RewriteCond %{HTTP_HOST} ^tomblanchard.co.uk$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www.tomblanchard.co.uk$
RewriteCond %{REQUEST_URI} !.root
RewriteRule (.*) /root/$1 [L,R=301,QSA]

这未经测试,因此如果它不起作用,请尝试使用它来满足您的需求。

于 2013-07-07T14:28:38.873 回答