htaccess为带或不带斜杠的网址添加.html扩展名

时间:2013-09-08 09:54:37

标签: php apache .htaccess redirect mod-rewrite

首先,我有一个自定义url重写,它将请求变量发送到php脚本

重写规则如下:

RewriteRule ^([\w\/-]+)(\?.*)?$ test/index.php?slug=$1 [L,T=application/x-httpd-php]

因此,如果您访问domain.com/slug-text之类的内容,则会将slug-text发送到位于名为test的文件夹中的index.php

我想要的是我的所有网址看起来都像domain.com/slug-text.html,但slug-test变量仍应发送到index.php文件。

我无法弄清楚的是重定向。我希望将所有旧网址从domain.com/slug-textdomain.com/slug-text/重定向到domain.com/slug-text.html,并将slug-text发送到位于测试文件夹中的index.php文件。

搜索了很多但无法在互联网上的任何地方找到这个问题的答案。

谢谢大家的帮助。

更新: 我的新代码是:

RewriteEngine On
Options +FollowSymlinks

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-l
RewriteRule ^(([\w/\-]+)?[\w-])(?!:\.html)$ http://domain.com/$1\.html [L,R=301]
RewriteRule ^(([\w/\-]+)?[\w-])(/|\.html)?$ test/index.php?slug=$1 [L]

domain.com/slug-text/未被重定向到domain.com/slug-text.html domain.com/slug-text按预期重定向到domain.com/slug-text.html

我需要改变什么?

2 个答案:

答案 0 :(得分:2)

这条规则:

RewriteRule ^(([\w/\-]+)?[\w-])(/|\.html)?$ test/index.php?slug=$1 [L]

将陷阱domain.com/slug-textdomain.com/slug-text/domain.com/slug-text.html并将slug-text发送到/test/index.php param内的slug

如果您真的想使用旧网址中的[R=301]重定向到新网址,请使用以下网址:

RewriteRule ^(([\w/-]+)?[\w-])/?(?!:\.html)$ http://domain.com/$1.html [L,R=301]
RewriteRule ^(([\w/-]+)?[\w-])\.html$ test/index.php?slug=$1 [L]

另请注意,使用显式重定向底部规则会被修改为陷阱网址以.html结尾

建议(如果您的.htaccess尚未包含此内容)过滤现有文件和文件夹的条件,以免被重定向规则捕获。只需在RewriteRule行之前添加这些行:

# existing file
RewriteCond %{SCRIPT_FILENAME} !-f
# existing folder
RewriteCond %{SCRIPT_FILENAME} !-d

如果使用符号链接:

# enable symlinks
Options +FollowSymLinks
# existing symlink
RewriteCond %{SCRIPT_FILENAME} !-l

//添加
您的.htaccess文件应如下所示:

RewriteEngine on
Options +FollowSymLinks
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-l
RewriteRule ^(([\w/-]+)?[\w-])/?(?!:\.html)$ http://domain.com/$1.html [L,R=301]
RewriteRule ^(([\w/-]+)?[\w-])\.html$ test/index.php?slug=$1 [L]

答案 1 :(得分:0)

这应该重定向/ slug-text到/slug-text.html

RedirectMatch ^/([\w-]+)/?$ http://domein.com/$1.html 

当slug-text只是字母,数字, - 和_时,就是这种情况。 将slug-text.html重写为php文件并将slug作为参数传递:

RewriteRule ^([\w-]+)\.html$ test/index.php?slug=$1 [R,L] 

如果您的.htaccess中有两行,则第一行将从旧版网址重定向到新版本,第二条版本将处理请求。