使用.htaccess重写URL的帮助

使用.htaccess重写URL的帮助,.htaccess,mod-rewrite,apache2,.htaccess,Mod Rewrite,Apache2,我的服务器上有html静态文件。我希望访问规则如下所示- 如果用户访问,他应该得到文件的内容 如果用户访问(没有尾随斜杠),他将被重定向到(运行规则1并获取文件test.html的内容) 只有当文件test.html存在时,规则1和2才应该触发 到目前为止,我已经- Options All -Indexes -Multiviews # Do not return details of server ServerSignature Off <IfModule mod_rewrite.c&g

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

  • 如果用户访问,他应该得到文件的内容
  • 如果用户访问(没有尾随斜杠),他将被重定向到(运行规则1并获取文件test.html的内容)
  • 只有当文件test.html存在时,规则1和2才应该触发
  • 到目前为止,我已经-

    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>
    
    选项所有-索引-多视图
    #不返回服务器的详细信息
    服务器签名关闭
    目录删除
    重新启动发动机
    重写基/
    #如果是对index.html的请求
    重写COND%{U请求}\/(.+/)?索引\.html(\?.*)\[NC]
    #移除它。
    重写规则^(+/)?索引\.html$/%1[R=301,L]
    #如果不存在匹配的.html,请向目录添加缺少的尾部斜杠。
    重写cond%{SCRIPT_FILENAME}/-d
    重写cond%{SCRIPT_FILENAME}.html-F
    重写规则[^/]$%{REQUEST_URI}/[R=301,L]
    #如果是来自浏览器的请求,而不是Apache/mod_rewrite的内部请求。
    RewriteCond%{ENV:REDIRECT_STATUS}^$
    #请求有一个HTML扩展名。重定向以删除它。
    重写规则^(+)\.html$/$1[R=301,L]
    #如果存在扩展名为.html的请求。
    RewriteCond%{SCRIPT_FILENAME}.html-f
    重写规则^(.*)/?$$1.html[QSA,L]
    
    虽然它适用于,但因(500内部错误)而失败

    最后一行的第二行不应该处理后面的斜杠吗

    [更新] 如果我使用Gumbo建议(.htaccess如下),则和都会得到404(带尾随斜杠)

    选项所有-索引-多视图
    #不返回服务器的详细信息
    服务器签名关闭
    错误文档404/404.html
    #Hide.htaccess
    命令允许,拒绝
    全盘否定
    目录斜杠
    重新启动发动机
    重写基/
    RewriteCond%{REQUEST_FILENAME}.html-f
    重写规则^[^/]+$%{REQUEST_URI}/[L,R=301]
    重写规则^([^/]+)/$$1.html[L]
    
    [更新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>
    
    选项所有-索引-多视图
    #不返回服务器的详细信息
    服务器签名关闭
    错误文档404/404.html
    #Hide.htaccess
    命令允许,拒绝
    全盘否定
    目录斜杠
    重新启动发动机
    重写基/
    重写cond%{REQUEST_FILENAME}-D
    重写规则^(+)/$/$1[R=301,L]
    #如果存在扩展名为.html的请求。
    RewriteCond%{SCRIPT_FILENAME}.html-f
    #并且没有尾随斜杠,重写以添加.html extesion。
    重写规则[^/]$%{REQUEST_URI}.html[QSA,L]
    
    试试这些规则:

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

    @普拉文:您是只使用我的规则,还是同时使用我的规则和您的规则?我已经更新了代码,将新的.htaccess包含在您的rules@pravin当前位置我不明白这为什么不起作用。至少对我有用。@Gumbo:你的.htaccess和我的一模一样吗?也许我做错了什么。@pravin:尝试使用mod_rewrite的日志功能调试规则(请参阅)。
    RewriteCond %{REQUEST_FILENAME}.html -f
    RewriteRule ^[^/]+$ %{REQUEST_URI}/ [L,R=301]
    RewriteRule ^([^/]+)/$ $1.html [L]