这个问题在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>
答案 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会导致外部重定向,而不管主机名是什么。 (?)