目录名称匹配模式的mod_rewrite

时间:2015-12-09 04:30:02

标签: php apache .htaccess mod-rewrite redirect

我一直在处理mod_rewrite问题几个小时。 我正在Windows下使用localhost。 Apache 2.4 with XAMPP

我正在尝试从我当地的htaccess做一个RewriteRule但没有成功。这是规则:

RewriteRule Event/(.*)$ event/this-event.php?id=$1 [L,R=301]

我需要重写的是:Event / 4027 to event / this-event?id = 4027

问题是我有一个名为event的目录,因此模式中的Event与事件目录混淆。如果我将模式中的事件更改为任何其他单词,则可以正常工作。

RewriteRule AnyWord/(.*)$ event/this-event.php?id=$1 [L,R=301] # This works!

htaccess文件位于DOCUMENT_ROOT文件夹中,内容只是:

RewriteEngine On

RewriteBase / 

# and the RewriteRule 

我已经尝试过我找到的所有提示,技巧和建议。我已经尝试了几个规则的变体,使用^ Event或(*。)/ Event等。还尝试使用RewriteCond检查目录中是否存在文件或是否存在目录。 我已经禁用了mod_speling模块,以防万一大写令人不安。也尝试过使用选项-Multiviews。

我无法解决这些问题。如果有人可以给我一个建议,我将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

请尝试以下代码。

RewriteEngine On

RewriteRule event/(.*)$ event/this-event.php?id=$1 [L,QSA]

并且网址适用于

http://localhost/project/Event/500
http://localhost/project/event/500

答案 1 :(得分:0)

您的问题可能是目标路径/event/this-event.php匹配模式Event /(.*)$并将其重写为自身。

您需要从重写中排除目标路径才能使此规则生效。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !/event/this-event\.php$
RewriteRule ^Event/(.+)$ event/this-event.php?id=$1 [NC,L,R]

rewriteCond在这里很重要,它检查请求是否为/event/this-event.php,跳过规则。

如果您希望网址不在浏览器中更改,请从最后一条规则中删除R标志。