我试图找到正确的.htaccess
配置,以在每个URL之后强制使用斜杠,但是在许多情况下会导致404。
我具有以下目录结构:-
所以如果我去:-
myurl.com/articles/post.html
或
myurl.com/articles/post
或
myurl.com/articles/post/
我需要全部重定向到.html
,但网址显示为:
myurl.com/articles/post/
因此,如果我转到myurl.com/contact/
,它需要显示myurl.com/contact.html
的内容,同时仍保持myurl.com/contact/
的网址。
下面是使用contact
路径的示例。如果我转到myurl.com/contact
和myurl.com/contact.html
,则收到200响应;如果我转到myurl.com/contact/
,则得到404。
这是我到目前为止所拥有的。
<IfModule mod_rewrite.c>
RewriteEngine on
# Remove .html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html
# Force trailing slash
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
</IfModule>
我正在努力解决这个问题,所以在此先感谢任何可以提供帮助的人!
答案 0 :(得分:0)
您的示例非常接近您的要求。问题在于,第一个RewriteRule匹配^(.*)$
,以正则表达式而言,这等于从字面上匹配任何内容。
可以通过在结尾位置元字符$
之前在正则表达式中添加缺失的正斜杠来实现您的规则,这意味着正则表达式现在将匹配任何内容,只要它以正斜杠结尾即可:{{ 1}}
已修复:
^(.*)/$
但是,在尝试理解Apache语法的同时,我认为我找到了一种更简单的解决方案来实现相同目的:
<IfModule mod_rewrite.c>
RewriteEngine on
# Remove .html
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)/$ $1.html
# Force trailing slash
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
</IfModule>