htaccess代码删除扩展名和添加+强制尾随斜杠?

时间:2009-07-01 11:25:43

标签: .htaccess mod-rewrite url-rewriting

我正在尝试整理一些htaccess代码,将 example.com/filename.php 转换为 example.com/filename / (并强制斜杠) - 我尝试了各种各样的方法,但是每个方法都没有用,从子文件夹上的500个错误到尾部斜杠的问题等等......

请帮忙!

6 个答案:

答案 0 :(得分:13)

试试这个:

RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]

RewriteRule (.*)/$ $1.php [L]

第一条规则将 /foo/bar .php的请求从外部重定向到 /foo/bar /。第二条规则将 /foo/bar /的请求内部重写为 /foo/bar .php

要强制使用尾随斜杠,请尝试以下规则:

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

答案 1 :(得分:6)

这个Gumbo解决方案非常适合文件,但它不适用于目录。 换句话说:

对于mysite.com/file1.php,它会显示mysite.com/file1/,这很棒。 然而,它对目录不起作用。如果我尝试访问以下目录(其中包含index.php文件)mysite.com/dir1,而不是显示http:/mysite.com/dir1/index.php和url:mysite.com/dir1/的内容,则返回404。 / p>

我的解决方案是:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]


RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ $1.php [L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule .*[^/]$ $0/ [L,R=301]

换句话说,如果是目录,不要做任何事情。

希望它有所帮助。

原始解决方案的另一个问题是,在我将路径更改为css文件并将图像更改为绝对路径之前,不会加载css和图像。

有没有其他方法可以解决它,而不是将网站中所有文件中的所有路径更改为绝对路径。

非常感谢。

答案 2 :(得分:2)

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

像魅力一样工作 - 感谢帮助人员。

答案 3 :(得分:0)

您可以尝试解决问题here。虽然问题的解决方案不相关(但是......),问题本身提供了一组重写规则,您可以在自己的网站中使用这些规则。

如果您需要URL中的符号,您可以使用“。*”而不是特定的A-Za-z0-9,但如果您正在寻找可能的尾部斜杠,则可能需要使用“。*?”代替。这是一个标准的正则表达式功能,以避免“。*”的贪婪。

答案 4 :(得分:0)

对于路径,您可以将<base href="yourpath" />添加到您的php页面。

答案 5 :(得分:0)

试试这个,这个可以在我的Apache上工作,即使你删除手册上的最后一个斜杠:

Options +FollowSymLinks -MultiViews
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} ^GET\ /[^?\s]+\.php
RewriteRule (.*)\.php$ /$1/ [L,R=301]
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]