我想进行一些URL重写(为什么?请参阅此问题。),以便用户可以看到和使用<而不是

labouseur.com/course-compilers.html 


br />
labouseur.com/course-compilers


(甚至更好,也许我应该对其进行重组,以便它是课程/编译器。)

我正在使用基于Linux的共享网站托管服务,因此我没有服务器的管理控制权,但是我拥有对.htaccess的控制权。我在网上阅读的参考文献对我来说似乎还不清楚,所以我在这里寻求一些清晰度和建议。

评论

请注意,这不是仅在服务器配置(.htaccess)中执行的操作。重要的第一步是实际更改应用程序中的URL,否则最终将导致大量不必要的重定向(或重复的内容)。

#1 楼

您实际上可以从服务器上的文件中删除.html并在htaccess中进行设置,以便将它们作为html文件提供,但这可能不是您想要的。

执行以下操作:

RewriteEngine on
# Check this condition to ensure that it's not a directory.
RewriteCond %{REQUEST_FILENAME} !-d
# Check this condition to ensure that there's a file there
RewriteCond %{REQUEST_FILENAME}\.html -f
# Replace html with your file extension, eg: php, htm, asp
RewriteRule ^(.*)$ .html


评论


这里有更多的复杂性,特别是如果您担心重复的内容问题。使用上述规则,您的页面仍然可以从旧的URL访问。

–JasonBirch
2010年7月9日在22:12

#2 楼

首先,请确保apache具有该模块,并允许它在.htacces文件中,然后添加:

RewriteEngine on

# Rewrite rules
RewriteRule ^/myoldsubfolder/(.*) /newfolder/ 


您的示例将需要

RewriteCond %{REQUEST_URI} !-d
RewriteCond %{REQUEST_URI}\.html -f
RewriteRule ^/(([a-zA-Z0-9_]+)/?)$ /.html


用于单层目录结构和

RewriteRule ^/(([a-zA-Z0-9_]+)/?)+$ /.html

用于多级结构。

但是请注意

如果您具有结构

/site/.htaccess
/site/subfolder/.htaccess
/site/subfolder/cats/.htaccess


.htaccess文件中的重写规则将相对于其父文件夹,您可以陷入一些混乱的重写循环情况。如果可以的话,请确保使用RewriteCond阻止它们发生!

评论


您是否介意在最后一点上使用更多信息(使用RewriteCond停止循环)?

–特拉维斯·诺斯库特(Travis Northcutt)
2010年7月9日13:30

#3 楼

除了上述答案以外,还可以使用
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^([\w-]+)$ .html [L]


([\w-]+)允许带连字符(-)的字母,数字。

(.*)将重写每个请求无论如何,这可能会导致以下其他规则失效,从而导致内部服务器在访问时出错。

评论


您的RewriteRule模式是对问题中给出的特定示例的可接受答案的改进,但是,当路径段多于例如时,它将无法匹配更一般的情况。 / path / to / course-compilers。包括L标志以减少对以下规则的影响。尽管(。*)模式不必要地通用,但由于存在检查文件的条件,因此不太可能引起严重问题。

–怀特先生
17年2月8日在11:22

#4 楼

您无需使用.htaccess文件即可完成此操作。只需将文件结构化为目录,而不是使用“ labouseur.com/course-compilers.html”,只需将文件index.html命名为“ course-compilers”即可。然后,当您指向该目录时,默认情况下将提供索引,但不会在URL中显示该索引。因此,您只需将链接写为“ labourseur.com/course-compilers”,一切都会好起来。

不需要.htaccess。