.html使用.htaccess重写规则从URL中删除

时间:2017-01-07 10:29:32

标签: apache .htaccess mod-rewrite url-rewriting

我有一个静态网站 - 一堆静态HTML页面。我想从我的网页的URL中删除.html部分。我使用了带有以下代码的.htaccess文件来执行此操作:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

但是,我收到404错误。例如:

  

在此服务器上找不到请求的网址/home/username/public_html/contact.html。

理想情况下,它应该重定向到/@username/contact.html。

添加信息 当我使用"选项-MultiViews"它在代码上方产生​​以下错误:

  

500内部服务器错误:服务器遇到内部错误或配置错误,无法完成您的请求。

此处使用Apache / 2.2.15(Red Hat)服务器。

为什么我要面对这个问题? root是否会自动从public_html/文件夹更改?

编辑:

目录结构:

  • 用户名
    • .gnome2(里面有空文件夹)
    • .mozilla(里面有空文件夹)
    • public_html(我在这里放了css,fonts,js等文件夹和.htaccess,contact.html,index.html等文件。)
    • .bash_logout中
    • 的.bash_profile
    • 的.bashrc

用户名文件夹位于universitynameuniverse文件夹下(我看不到其他文件夹)。

2 个答案:

答案 0 :(得分:0)

在.htaccess中尝试此代码:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.html [NC,L]

就是这样!您现在可以链接HTML文档中的页面,而无需添加页面的扩展名。

答案 1 :(得分:0)

试试这个:

Options +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME}.html -f
    RewriteRule !.*\.html$ %{REQUEST_FILENAME}.html [QSA,L]
</IfModule>
## Results
# ~user/contact => ~user/contact.html (only if file exists)

仅当~user/目录实际存在于文件系统上时才有效。

如果您需要外部重定向,请在RewriteRule指令中添加R标志。

您的重写规则存在的问题是,它会在整个.html变量后附加%{REQUEST_URI}后缀,这可能会导致404。

更新

重新阅读您的问题我注意到您要将~user部分映射到apache webroot之外的某个位置。在这种情况下,试试这个:

Options +FollowSymLinks

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteBase /

    RewriteCond %{REQUEST_URI} ^/~(.+)/(.+)$
    RewriteCond /home/%1/public_html/%2.html -f
    RewriteRule . /home/%1/public_html/%2.html [QSA,L]
</IfModule>
## Results
# ~user/contact => /home/user/public_html/contact.html (only if file exists)