2016-12-08 159 views
0

我试图从我的URL中删除.html文件扩展名,使它们看起来更好。我见过很多这样的例子,并且已经尝试过了,但是我正在努力寻找只能在根目录下工作的东西,并且不适用于任何子目录或子域。只删除URL中的.html扩展名

我可以得到任何帮助吗?

实施例: example.org/test.html> example.org/test

example.org/food/xyz.html> example.org/food/xyz.html login.example.org/ something.html> login.example.org/something.html

+0

请问的问题更具体的方式。目前这个问题非常广泛而且很难回答。为什么你的_specific_问题?为什么不能简单地修改其中一个工作示例并根据需要进行调整? – arkascha

回答

0

你的问题有点模糊,所以我将集中讨论你提到的主要问题:

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

替代做法:

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

如果这仅限于单个主机名(因为您的示例可能建议)取决于您的设置。如果您将规则放置在您的http服务器的真实主机配置中,而不是使用.htaccess样式文件,则此类事情最容易完成。这也是为什么我添加的一般提示:


你应该总是喜欢在http服务器主机配置,而不是使用.htaccess样式文件中这样的规则。这些文件出了名的错误,很难调试,他们真的放慢了服务器。它们仅提供作为的情况下最后的选择,你没有对主机配置控制(读:真的很便宜的托管服务提供商),或者如果你有依赖于写自己的重写规则(这是一个明显的安全恶梦的应用)。


在你写,你也想短符号的评论,所以重定向用户请求一个URL这样的“文件扩展名”的版本没有。

我实在看不出任何一点这样的,但可以肯定的是可能的:

RewriteEngine on 

RewriteCond %{ENV:REDIRECT_STATUS} !^. 
RewriteRule ^. - [L] 

RewriteCond %{REQUEST_URI} ^/.+\.html$ 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^/?(.+)\.html$ /$1 [L,R=301] 

RewriteCond %{REQUEST_URI} !^/.+\.html$ 
RewriteCond %{REQUEST_FILENAME}.html -f 
RewriteRule ^/?([^/]+)$ /$1.html [L] 
+0

谢谢!这似乎工作得很好,但并不完全。出于某种原因,我仍然可以通过/about.html访问,即使URL应该重写为/ about。无论哪种方式工作,但我希望它强制非HTML版本,如果这是有道理的.. –

+0

@ShaneT好了,添加了一个版本,应该实现这一点。 – arkascha

+0

那一个没有工作。我已经做了一些重写来强制HTTPS和WWW。 –