如何链接到没有.html扩展名的页面?

28

我想链接到我的网站内部页面,例如: 不是:mywebsite.com/about.html 而是:mywebsite.com/about/

我看过各种网站这样做,但它们似乎对某些事情也有不同的反应:

Apple.com: apple.com/iphone/ 可用,apple.com/iphone/index.html 可用,apple.com/iphone 重定向。

Opera.com: opera.com/mobile/ 重定向,opera.com/mobile 可用,opera.com/mobile.html 无法使用。

Mozilla.com: mozilla.org/en-US/ 可用,mozilla.org/en-US 重定向,mozilla.org/en-US/index.html 无法使用。

这就引出了另一个问题:这里是否有不同的方法?

编辑: 看起来苹果为每个页面使用一个文件夹,例如一个名为“iphone”的文件夹,里面有一个index.html文件? 但是Opera和Mozilla在.htaccess文件中使用了一些东西?


3
被称为URL重写...现在这是你的起点,去阅读吧 :-) - Laurent S.
7个回答

20

移除扩展名

例如,要从PHP文件中删除.php扩展名,比如从yoursite.com/wallpaper.php到yoursite.com/wallpaper,您需要在.htaccess文件中添加以下代码:

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

如果你想从一个HTML文件中去掉“.html”扩展名,例如从yoursite.com/wallpaper.html变为yoursite.com/wallpaper,你只需要修改上述代码的最后一行以匹配文件名:

RewriteRule ^([^\.]+)$ $1.html [NC,L]

好了!现在你可以在HTML文档内链接页面,无需添加页面的扩展名。例如:

 <a href="http://whatever.com/wallpaper" title="wallpaper">wallpaper</a>

1
尝试了一下,现在显示“无法连接”,有什么想法吗? - Harry

12
他们正在使用`.htaccess`和`URL重写`,这是服务器配置的一部分。你不能仅使用HTML来完成它。
页面解释了URL重写的基础知识。

URL重写在.htaccess文件中吗?它们是否都使用不同的.htaccess和/或URL重写工具? - user2451987
是的,您可以在您的 .htaccess 文件中定义别名规则。有许多网站处理这个问题。看看 @Marijke 的好例子。 - ibi0tux

9
您的文件夹必须包含一个文件:index.*,例如:/iphone/index.html,也可以是/iphone/。
或者使用.htaccess

1
使用哪个更好?一个比另一个更快或更稳定吗? - user2451987
2
如果你希望通过 foo.com/folder/ 地址访问你的网站,你可能想要使用 index.*,因为它更简单、 less elaborate。 - user2354690

3
在您站点根文件夹的 .htaccess 文件中,只需添加以下行:
# ---- Render pages without urls
Options +MultiViews

我正在使用cPanel,这是2022年最简单的解决方案。 - nashihu

2
最受欢迎的答案没有检查URL是否指向目录,因此当它尝试将“.html”附加到目录路径时,您将会遇到一些神秘的“未找到”错误。很容易修复:”
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html [L]

第一个条件只有在路径不指向有效目录时才通过。第二个条件只有在添加 .html 扩展名后路径指向有效文件时才通过。如果这两个条件都满足,则重写规则仅将“.html”添加到文件名中。
请注意,我们可以使用“.*”来匹配整个路径。如果您希望拒绝包含句点字符的路径,可以这样做,但实际上并不必要,因为您已经检查了 {REQUEST_FILENAME}.html 是否是有效文件。无论如何,在字符类内部不需要转义句点字符。我知道你到处看到这个 [^\.],但斜杠是多余的。[ ^.] 是写它的方法,看起来像正则表达式专业人士。
这种重定向对用户来说是不可见的,因为默认情况下,mod_rewrite 在不通知浏览器的情况下在内部进行替换。如果您想执行永久重定向,可以在末尾添加 [R=301] 标志。
另外,正如Genus Amar所说,您可以通过在.htaccess文件中添加Options Directive来针对每个目录启用Multiviews选项。
Options +MultiViews

值得一提的是,这仅在服务器管理员启用了AllowOverride指令中的MultiViews时才有效,并且它不允许你执行其他重定向操作。
这两种解决方案(单独使用)都不能删除请求的URL中的.html。如果您也想这样做,请参见我的答案这个问题

1
我查看了许多网站,只有这个完美地为我工作。感谢您的贡献。 - osmancalisir

0

让网站是www.abc.com/index.html,而你只需要显示www.abc.com/index,然后在Node.js(express)中将会是:

//Let your all files like index.html, css, js be in public folder

const express = require('express');
const path = require('path')




app.get('/:name', (req, res) => {
  var filePath = ""
  const fileName = req.params.name;

//////Check if file is not .html file like css, js etc
  if(fileName.includes(".css") || fileName.includes(".js") || fileName.includes(".png") || fileName.includes(".jpg") || fileName.includes(".svg")){
    filePath = path.join(__dirname, 'public', fileName)
  }
  else{
  filePath = path.join(__dirname, 'public', fileName + ".html");
  }
  res.sendFile(filePath, err => {
    if (err) {
      console.log(`Error sending file: ${err.message}`);
      res.status(err.status).end();
    } else {
      console.log(`File sent: ${filePath}`);
    }
  });
});

// serve static files
app.use(express.static(path.join(__dirname, 'public')));

// start the server
app.listen(3000, () => {
  console.log('Server running on port 3000');
});


-4

将您的href属性设置为您想要链接的页面或..如果您需要向上移动一个目录。

例如:href="contact.html" 例如:href="../links/contact.html"


这正是我们试图解决的确切问题。 - Farhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接