强制.htaccess中的结尾反斜杠导致404错误

时间:2019-05-25 18:48:14

标签: apache .htaccess mod-rewrite

我试图找到正确的.htaccess配置,以在每个URL之后强制使用斜杠,但是在许多情况下会导致404。

我具有以下目录结构:-

  • 文章
    • post.html
  • 作品集
    • lorum1.html
    • lorum2.html
    • lorum3.html
  • contact.html

示例1

所以如果我去:-

myurl.com/articles/post.htmlmyurl.com/articles/postmyurl.com/articles/post/

我需要全部重定向到.html,但网址显示为: myurl.com/articles/post/


示例2

因此,如果我转到myurl.com/contact/,它需要显示myurl.com/contact.html的内容,同时仍保持myurl.com/contact/的网址。


当前正在发生什么

下面是使用contact路径的示例。如果我转到myurl.com/contactmyurl.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>

我正在努力解决这个问题,所以在此先感谢任何可以提供帮助的人!

1 个答案:

答案 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>