Apache2重写了奇怪的行为

时间:2014-01-11 06:48:10

标签: apache .htaccess mod-rewrite clean-urls

对于时事通讯,我正在尝试为取消订阅页面制作干净的网址

起初我有这个,但它无法正常工作:

RewriteEngine On
RewriteBase /
RewriteRule ^/unsubscribe/(.*)$ /unsubscribe.php?email=$1 [NC,L]

我认为这很奇怪。所以我尝试了其他一些方法,结果如下:

RewriteEngine On
RewriteBase /
RewriteRule ^/?unsubscribe/?(.*)$ /unsubscribe.php?email=$1 [NC,L]
事实上,这是有效的。但它给出了非常奇怪的结果。

电子邮件参数值现在是:

  

.PHP /测试

这让我疯了,因为我不明白为什么会这样做。

有没有人知道这里发生了什么以及如何解决这个问题?

我宁愿不用字符串替换php,这里有问题。

4 个答案:

答案 0 :(得分:1)

你好,我的朋友? :)

你可以尝试一下,让我知道它是否有效?让我们弄清楚这一点!

RewriteEngine On

RewriteRule ^取消订阅/([^/.]+)/?$ unsubscribe.php?email = $ 1 [L]

答案 1 :(得分:1)

您的第一个规则不起作用,因为该规则获取了URL中的基础。因此,如果网址为/unsubscribe/my@email,则RewriteBase/)会被删除,而RewriteRule会看到unsubscribe/my@email而没有前导/。

在您的第二条规则中,由/设置为? - es。因此unsubscribe.php/test会找到文字unsubscribe,并将其背后的所有内容 - .php/test - 并将其放入电子邮件参数中。猜测您在测试时应该在浏览器中使用/unsubscribe/test,而不是/unsubscribe.php/test

答案 2 :(得分:1)

此规则适用于您:

Options -MultiViews
RewriteEngine On
RewriteBase /

RewriteRule ^/?unsubscribe(?:/(.+))?$ /unsubscribe.php?email=$1 [NC,L,QSA]

问题出在你的正则表达式中,它在第一次应用后与模式匹配并重写两次。

答案 3 :(得分:0)

好的,它解决了。

默认情况下,似乎启用了MultiViews(无论可能是什么)。

添加:

Options -MultiViews

对htaccess(或apache config)修复了问题。