我目前正在使用:
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.html
,service-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
答案 0 :(得分:1)
您有两种选择:
此规则不起作用的原因是您需要使用尾部斜杠来添加 .html 扩展名。您可以在重写正则表达式中删除该要求:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.+)$ $1.html [L]
更好的方法是在 services 目录中创建名为 index.html 的文件。然后,当您请求没有文件名的目录时,将自动使用该文件。
对于第一个工作选项,您还需要更改默认行为。您可以使用此行来防止向目录添加尾部斜杠:
DirectorySlash Off