我已经在我的.htaccess
文件中苦苦挣扎了好几个星期,我多次改变它但是它不起作用。
我在.htaccess
文件中有这个:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^/([^./]+)\.html$ category.php?id=$1
RewriteRule ^/([^./]+)\.html$ tag.php?id=$1
RewriteRule ^/([^./]+)\.html$ play.php?id=$1
但它不起作用。
答案 0 :(得分:0)
您确定在Apache中打开了mod_rewrite吗?你有权访问httpd.conf吗?最好在那里进行重定向,而不是使用.htaccess文件。
答案 1 :(得分:0)
您的条件仅适用于第一条规则。每组RewriteCond
的仅适用于紧随其后的RewriteRule
。因此,条件仅适用于RewriteRule ^/([^./]+)\.html$ category.php?id=$1
,最后两条规则根本没有条件。
您的条件是将存在重写为其他内容,这将导致重写循环。你可能想要:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
您的第二个和第三个规则将永远不会被应用,因为如果有人请求/some-page.html
,则第一个规则的正则表达式将匹配它并将URI重写为/category.php?id=some-page
,然后规则旁边的内容永远不会匹配,因为第一条规则已经将URI重写为category.php
。
您的正则表达式匹配一个前导斜杠,在htaccess文件中的重写规则中应用的URI会删除前导斜杠,所以您需要这样:
RewriteRule ^([^./]+)\.html$ category.php?id=$1
1,2和4很容易。 3,没那么多。您将不得不找出一种将html页面表示为类别,标记或播放的独特方式。你不能让所有3看起来都相同,没有办法告诉你想要哪一个。取:
/something.html
这应该是一个类别吗?标签?还是玩?谁知道,你的重写规则肯定不会。但如果你在前面加上一个关键字,那么你可以区分:
/category/something.html
/tag/something.html
/play/something.html
你的规则如下:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^category/([^./]+)\.html$ category.php?id=$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^tag/([^./]+)\.html$ tag.php?id=$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^play/([^./]+)\.html$ play.php?id=$1