Htaccess问题和坏标志分隔符

时间:2014-11-10 13:52:58

标签: regex apache .htaccess mod-rewrite redirect

我是htaccess的新手,我几个小时都在搜索任何解决方案。到目前为止没有任何作这里有什么问题?

Options +FollowSymLinks

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
RewriteRule ^articles/([^/.]+)/?$ articles.php?topic=$1 [L]

</IfModule>

我也尝试过:

RewriteRule ^ articles/$ articles.php?topic= [L]

还有很多其他规则。

如果我将第4行更改为(删除空格):

RewriteRule ^index.php [L]

它给我找不到错误。

如果我改变第5行:

RewriteRule ^ articles/$ articles.php?topic= [L]

它提供了坏标志分隔符。

我正在使用MAMP。 谢谢!

编辑:第一条规则来自本教程: http://forum.codecall.net/topic/74170-clean-urls-with-php/

我试图添加第二个来改变这个:

... site / articles.php?topic = historical-background

对此:

... site / articles / historical-background

但没有任何反应或者我得到上述错误之一。

编辑2:

我的索引文件:

include('template/header.php'); 
include('views/'page.php'); 
include('template/footer.php'); 

page.php(在root / views文件夹中):

...

if ($page['id'] == 15) { ?>  // id of articles page
<div class="content_container"> <?php 
include('views/articles_list.php');  
?>
</div>
<?php 
}

...

articles_list.php(在root / views文件夹中)。它显示文章列表:

...

while($row = mysqli_fetch_array($result))
{
?>  
<h2><?php echo $row['title']; ?></h2>
<p><i><?php echo 'By '.$row['author']; ?></i></p>
<p><?php echo $row['header']; ?></p>
<a href="http://localhost/site/articles.php?topic=<?php echo $row['slug'] ?>">Read</a><br> //I get to article.php from here.
<hr>
<?php
}
?>

...

articles.php位于根文件夹中。它显示了所选的文章。 htaccess也在根本。

1 个答案:

答案 0 :(得分:0)

您似乎需要在此处停用MultiViews并重新排列规则:

Options +FollowSymLinks -MultiViews

<IfModule mod_rewrite.c>

RewriteEngine on

RewriteCond %{THE_REQUEST} \s/+articles\.php\?topic=([^\s&]+) [NC]
RewriteRule ^ articles/%1? [R=302,L,NE]

RewriteRule ^articles/([^/.]+)/?$ articles.php?topic=$1 [NC,L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

</IfModule>

MultiViews之前运行的Apache's content negotiation module使用选项mod_rewrite,并使Apache服务器匹配文件扩展名。因此/file可以在网址中,但它会投放/file.php