使用.htaccess帮助重写URL

时间:2010-10-15 10:47:35

标签: .htaccess mod-rewrite apache2

我的服务器上有html静态文件。我希望访问规则为 -

  1. 如果用户访问http://example.com/test/,则应获取文件http://example.com/test.html
  2. 的内容
  3. 如果用户访问http://example.com/test(没有尾部斜杠),他会被重定向到http://example.com/test/(运行规则1并获取文件test.html的内容)
  4. 规则1和2只应在文件test.html存在的情况下触发。
  5. 到目前为止,我有 -

    Options All -Indexes -Multiviews
    # Do not return details of server
    ServerSignature Off
    
    <IfModule mod_rewrite.c>
    DirectorySlash Off
    RewriteEngine On
    RewriteBase /
    
    # If it's a request to index.html
    RewriteCond %{THE_REQUEST} \ /(.+/)?index\.html(\?.*)?\  [NC]
    # Remove it.
    RewriteRule ^(.+/)?index\.html$ /%1 [R=301,L]
    
    # Add missing trailing slashes to directories if a matching .html does not exist.
    RewriteCond %{SCRIPT_FILENAME}/ -d
    RewriteCond %{SCRIPT_FILENAME}.html !-f
    RewriteRule [^/]$ %{REQUEST_URI}/ [R=301,L]
    
    # If it's a request from a browser, not an internal request by Apache/mod_rewrite.
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    # And the request has a HTML extension. Redirect to remove it.
    RewriteRule ^(.+)\.html$ /$1 [R=301,L]
    
    # If the request exists with a .html extension.
    RewriteCond %{SCRIPT_FILENAME}.html -f
    RewriteRule ^(.*)/?$ $1.html [QSA,L]
    </IfModule>
    

    虽然它适用于http://example.com/test,但http://example.com/test/失败(500内部错误)

    第二行不应该处理尾部斜杠吗?

    [更新] 如果我使用Gumbo建议(后跟.htaccess),我会得到http://example.com/testhttp://example.com/test/的404(带斜杠)

    Options All -Indexes -Multiviews
    # Do not return details of server
    ServerSignature Off
    
    ErrorDocument 404 /404.html
    
    # Hide .htaccess 
    <Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    </Files>
    
    <IfModule mod_rewrite.c>
    DirectorySlash On
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME}.html -f
    RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]
    RewriteRule ^([^/]+)/$ $1.html [L]
    
    </IfModule>
    

    [更新2] 我已经放弃了。下面的代码可以使用,但它不会强制所有内容以/(http://example.com/test/)结尾,而是删除尾部斜杠(http://example.com/test)。从好的方面来说,它确保内容仅由一个URL指向,保留了SEO。我现在要和它一起生活。

    Options All -Indexes -Multiviews
    # Do not return details of server
    ServerSignature Off
    
    ErrorDocument 404 /404.html
    
    # Hide .htaccess 
    <Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    </Files>
    
    <IfModule mod_rewrite.c>
    DirectorySlash On
    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)/$ /$1 [R=301,L]
    
    # If the request exists with a .html extension.
    RewriteCond %{SCRIPT_FILENAME}.html -f
    # And there is no trailing slash, rewrite to add the .html extesion.
    RewriteRule [^/]$ %{REQUEST_URI}.html [QSA,L]
    
    
    </IfModule>
    

1 个答案:

答案 0 :(得分:2)

请尝试以下规则:

RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]
RewriteRule ^([^/]+)/$ $1.html [L]