在我的“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]
答案 0 :(得分:1)
mod_rewrite中指令的顺序很重要,因为每个规则都将前一个规则的输出视为要测试的输入。您需要按顺序执行3(或可能4)项操作:
/root/
开头的任何网址(我们必须先执行此操作,否则所有内容将被拒绝!).html
的网址会导致浏览器重定向到非.html
表单。这需要在其他重写之前发生,否则你无法区分浏览器中的.html和虚拟添加的.html。/root/
目录中查找上面未拒绝的任何网址,而不是已配置的DocumentRoot
.html
下的目录的任何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:注意我用谨慎的语言来描述(内部)重写,而不是(浏览器)重定向:你拥有的规则不是从任何东西中删除 .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]
这是未经过测试的,如果它不起作用,请使用它来满足您的需求。