.htaccess文件RewriteRules不起作用

时间:2015-03-31 08:24:18

标签: php regex apache .htaccess mod-rewrite

这个问题在StackOverflow上被多次回答,我确实搜索了很多,但似乎没有答案对我有用。我已经阅读了this article,并找出了为什么添加Options +FollowSymlinks,这应该是RewriteRules工作所必需的,对我来说不起作用(我的主机在根级别自动启用它)。所以我把它从我的文件中删除了,如果Rewrite引擎工作的话就试过了。确实如此,但没有Regex的东西。所以我在http://example.com/hta.php?id=something&jmeno=somethingelse设置了一个测试网站,并将以下内容添加到我的.htaccess文件中:

RewriteEngine On

RewriteRule ^testdis/([0-9]+)/([a-z]+) http://example.com/hta.php?id=$1&jmeno=$2 [NC]

这可以让我能够访问http://example.com/testdis/5/s并像之前提到的http://example.com/hta.php?id=5&jmeno=s那样工作,但它会将地址重写为网址标签中的第二个不需要的地址。

所以我的问题是:为什么我的重写规则不起作用,我该如何使其工作?

编辑:添加[R]参数使我能够在浏览器中输入“nice”网址,并在输入后将其重定向到带有工作值的“旧/丑”页面。但是我想让它显示“好”的网址。

编辑2 :我被要求发布我的hta.php文件的代码。我认为无论如何都不重要,但这里是

<?php
  echo '<meta charset="UTF-8">';
  if(isset($_GET['id'])){
  $id = $_GET['id'];
  }
  if(isset($_GET['jmeno'])){
  $jmeno = $_GET['jmeno'];
  }
?>
<!DOCTYPE html>
<html lang="cs">
    <head>
    <title>Test</title>
    </head>
    <body>
  <?php echo $id; ?>
  <br /><br />
  <?php echo $jmeno; ?> 
  </body>
</html>

1 个答案:

答案 0 :(得分:1)

对于内部重写,RewriteRule替换不应包含方案和主机名,因此以下是优选的(并且似乎解决了此实例中的问题):

RewriteRule ^testdis/([0-9]+)/([a-z]+) /hta.php?id=$1&jmeno=$2 [L]

通常,如果指定绝对URL,它将隐式触发外部重定向(就像您已明确使用R标志一样)。虽然,the docs state如果主机名与当前主机匹配(据我所知,在此实例中),重写引擎应该自动从替换中剥离方案和主机名。

参考:
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html#rewriterule

但是,根据我的经验,这似乎不会发生,替换总是中的绝对URL会导致外部重定向,而不管主机名是什么。 (?)