使用.htaccess重写URL的帮助
我的服务器上有html静态文件。我希望访问规则如下所示-使用.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
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]