如果匹配的文件名存在,则忽略目录

时间:2017-03-14 20:32:49

标签: .htaccess mod-rewrite

我目前正在使用:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)/$ $1.html [L]

..为我的.html文件制作漂亮的网址。

假设这样的目录结构:

/services/service-one.html
/services/service-two.html
/services.html
/something-else.html

service-one.htmlservice-two.html& something-else.html一切正常,但我无法使用services.html网址加载/services,因为有一个与名称匹配的目录。

是否有一种方法可以更改此行为,以便RewriteCond %{REQUEST_FILENAME}.html -f无论与目录匹配的URL如何都可以正常工作?或者也许是另一种实现相同结果的方式?

谢谢!

修改

删除我的.htaccess并发现那些非.html链接仍然有用之后,我看了一下我的VirtualHost并想知道它是否在那里导致它?我可以看到MultiViews正在为我提供我想在.htaccess中实现的URL重写行为

<VirtualHost *:80>
    DocumentRoot "/mysite"
    ServerName testsite.com
     <Directory "/mysite">
         Options Indexes FollowSymLinks MultiViews
         AllowOverride All
         Require all granted
     </Directory>
    # Other directives here
</VirtualHost>

修改2

行为保持不变,没有MultiViews,并使用匿名.htaccess

1 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 此规则不起作用的原因是您需要使用尾部斜杠来添加 .html 扩展名。您可以在重写正则表达式中删除该要求:

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME}.html -f
    RewriteRule ^(.+)$ $1.html [L]
    
  2. 更好的方法是在 services 目录中创建名为 index.html 的文件。然后,当您请求没有文件名的目录时,将自动使用该文件。

  3. 对于第一个工作选项,您还需要更改默认行为。您可以使用此行来防止向目录添加尾部斜杠:

    DirectorySlash Off