根文件夹更改(.htaccess)

时间:2013-07-07 13:35:34

标签: .htaccess mod-rewrite

在我的“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”指向“索引”。 html“在”root“目录下的文件,我希望”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]

2 个答案:

答案 0 :(得分:1)

mod_rewrite中指令的顺序很重要,因为每个规则都将前一个规则的输出视为要测试的输入。您需要按顺序执行3(或可能4)项操作:

  1. 拒绝访问以/root/开头的任何网址(我们必须先执行此操作,否则所有内容将被拒绝!)
  2. 通常的做法是确保每个网址只有一个有效表单,因此执行指定.html的网址会导致浏览器重定向到非.html表单。这需要在其他重写之前发生,否则你无法区分浏览器中的.html和虚拟添加的.html。
  3. /root/目录中查找上面未拒绝的任何网址,而不是已配置的DocumentRoot
  4. 如果该文件存在,请查找未指向URL + .html下的目录的任何URL。这必须在其他重写之后,否则“文件存在”检查将始终失败。
  5. #  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:注意我用谨慎的语言来描述(内部)重写,而不是(浏览器)重定向:你拥有的规则不是从任何东西中删除 .html,它是添加,从而允许访问页面如果其他人删除它。由于您经常在一组规则中进行修改,因此请务必清楚地了解浏览器请求的URL与Apache最终将服务的虚拟URL之间的区别。

答案 1 :(得分: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]

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