使用htaccess将directory-name的请求重定向到directory-name.html

时间:2011-12-08 17:22:18

标签: html .htaccess redirect

在我的网站上,当有人请求目录时,我希望它删除'/'并添加'.html'(当然减去引号)。

例:
如果有人转到domain.com/directory/,则应该重定向到domain.com/directory.html/并且应该代表相同的内容:domain.com/another-directory/应该重定向到domain.com/another-directory.html

我想在我的htaccess文件中放置一行(或两行)代码,使任何目录(以/结尾的网址)重定向到URL.html(删除{ {1}}当然)。

我还希望它可视化重定向,因此用户实际上会看到它更改为/

我是一名新手网络程序员,非常感谢任何帮助。

注意:我确实使用了.html,但这确实有效,但这需要大量的额外编码,我更喜欢用一个简单的语句来覆盖所有目录。

1 个答案:

答案 0 :(得分:1)

使用htaccess会有点困难,我假设您要执行以下操作:

  1. 如果有人访问的目录不是根目录(只是http://domain.com/),请将它们重定向到以.html结尾的目录名
  2. 在重定向后,在内部将.html 返回重写到该目录,以便apache可以为该目录提供服务。
  3. 第一个是直截了当的:

    # check to make sure the request isn't actually for an html file
    RewriteCond %{THE_REQUEST} !^([A-Z]{3,9})\ /(.+)\.html\ HTTP
    # check to make sure the request is for a directory that exists
    RewriteCond %{REQUEST_FILENAME} -d
    # rewrite the directory to 
    RewriteRule ^(.+)/$ /$1.html [R]
    

    第二部分很棘手

    # check to make sure the request IS for an html file
    RewriteCond %{THE_REQUEST} ^([A-Z]{3,9})\ /(.+)\.html\ HTTP
    # See if the directory exists if you strip off the .html
    RewriteCond %{DOCUMENT_ROOT}/%2 -d
    # Check for an internal rewrite token that we add
    RewriteCond %{QUERY_STRING} !r=n
    # if no token, rewrite and add token (so that directories with index.html won't get looped)
    RewriteRule ^(.+)\.html /$1/?r=n [L,QSA]
    

    但是,如果您拥有的是一堆名为directory.htmldirectory2.htmldirectory3.html等的文件,并且您希望在有人进入{{3}时这样做在他们的地址栏中,他们可以获得directory2.html的内容,这将更加简单:

    # check to make sure the request isn't actually for an html file
    RewriteCond %{THE_REQUEST} !^([A-Z]{3,9})\ /(.+)\.html\ HTTP
    # check to see if the html file exists (need to do this to strip off the trailing /)
    RewriteCond %{REQUEST_URI} ^/(.+)/$ 
    RewriteCond %{DOCUMENT_ROOT}/%1.html -f
    # rewrite
    RewriteRule ^(.+)/$ /$1.html [L]