【发布时间】:2015-06-04 12:22:58
【问题描述】:
这个问题在 StackOverflow 上被回答了无数次,我确实搜索了很多,但似乎没有任何答案适合我。我已经阅读了this article,并发现了为什么添加Options +FollowSymlinks,这对我来说是RewriteRules 工作所必需的(我的主机在根级别自动启用了它)。所以我从我的文件中删除了它,并尝试了重写引擎是否可以工作。确实如此,但没有任何正则表达式的东西。所以我在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 一样工作,但它会将地址重写为 URL 选项卡中第二个不需要的地址。
所以我的问题是:为什么我的重写规则不起作用,我该如何让它起作用?
编辑:添加[R] 参数使我能够在我的浏览器中输入“漂亮”的网址,并在按下输入时将我重定向到具有工作值的“旧/丑陋”页面。但是我希望它显示“不错”的网址。
编辑 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>
【问题讨论】:
-
在这种情况下这并不重要,因为您正在重写同一个域(Apache 应该剥离协议/域),但对于内部重写,您不应该真正指定协议/域。只需
/hta.php?id=$1&jmeno=$2。这里需要L标志吗?虽然如果它是唯一的指令,它应该没关系。尝试将其更改为临时重定向 (R) 以确保它正确重写。我假设您在 .htaccess 中没有其他内容? -
您发现什么有效?您是否以任何形式成功使用了
RewriteRule指令? “......并尝试过 Rewrite 引擎是否可以工作。它确实可以,但是” - 它以什么方式“工作”? -
@w3d 我将尝试更改标志,我将编辑此评论,或写另一个。是的,我已成功使用
RewriteRule将所有 .html 文件重定向到 .php 文件(在我发布的同一指南中阅读) -
标志之间不应该有空格,应该是
[NC,R],而不是[NC, R]——这会导致500错误。 (空格是 Apache 配置文件中的分隔符。)您还有哪些其他标志?你能发布hta.php的实际.htaccess 和内容吗?没有充分的理由说明内部重写不起作用。 -
好吧,我很难过。但是,我肯定会将
RewriteRule替换更改为根相关(如第一条评论中所述)。 IE。RewriteRule ^testdis/([0-9]+)/([a-z]+) /hta.php?id=$1&jmeno=$2 [L]会更好。
标签: php regex apache .htaccess mod-rewrite