Apache URL Mod_Rewrite

Apache URL Mod_Rewrite

为什么调用此 URL 时,以下 .htaccess 文件会产生 300 错误?

网站重定向到正确的 php 页面,但返回 2 次 300

网址:hxxp://subdomain.domainame.com/keyword/

IndexIgnore *

RewriteEngine on
RewriteRule ^([a-z]+)/?$ /index.php?p=$1

错误日志:(300)
文件不存在:/home/admin/public_html/subdomain/keyword(没有尾随斜杠)


其他问题

我是否需要扩展重写规则来获取 URL 中的以下内容:

/index.php?p=keyword 

调用的 URL 是 /keyword/ 。它是否返回 300 - 多项选择状态,因为以下内容是可能的?

 /index.php?p=keyword
 /keyword
 /keyword/ 

答案1

尝试

RewriteRule ^([^/]*)/$ /index.php?p=$1 [L]

一旦规则命中,您需要 L 标志来停止重写。(否则您会陷入无限循环)

答案2

我认为问题实际上是正则表达式开头缺少正斜杠。不过,c10k Consulting 建议使用“Last”标志是个好主意。试试这个:

RewriteRule ^/([a-z]+)/?$ /index.php?p=$1 [L]

根据其余的 Apache 配置和 URL 模式,您可能需要稍微扩展一下重写规则,如下所示:

RewriteEngine on
RewriteRule %{REQUEST_URI} !.php
RewriteRule ^/(\w+)/?$ /index.php?p=$1 [L]

第一条规则可防止重写对 PHP 文件的请求,第二条规则使用“word”正则表达式标记。同样,它要求 REQUEST_URI 以正斜杠开头,后跟一个单词,然后结束,或者后跟一个正斜杠,然后结束。

希望这能有所帮助!祝你好运,坚持使用 mod_rewrite。它是一款可靠且精心打造的工具。

答案3

这对我适用于 apache 2.2.16:

RewriteRule ^([a-z]+)/?$ /index.php?p=$1 

以下是重写日志:

init rewrite engine with requested uri /keyword/
pass through /keyword/
[perdir /var/www/html/] add path info postfix: /var/www/html/keyword -> /var/www/html/keyword/
[perdir /var/www/html/] strip per-dir prefix: /var/www/html/keyword/ -> keyword/
[perdir /var/www/html/] applying pattern '^([a-z]+)/?$' to uri 'keyword/'
[perdir /var/www/html/] rewrite 'keyword/' -> '/index.php?p=keyword'
split uri=/index.php?p=keyword -> uri=/index.php, args=p=keyword
[perdir /var/www/html/] internal redirect with /index.php [INTERNAL REDIRECT]

我将借此机会纠正其他一些答案。

一旦规则命中,您需要 L 标志来停止重写。(否则您会陷入无限循环)

这是错误的,原因有二:(1)index.php 与 '^([az]+)/?$' 不匹配;(2)即使匹配也[L]不会停止处理,因为每个目录的重写会导致内部重定向(参见日志)(通常如此),而这[L]不会停止。

我认为问题实际上在于正则表达式开头缺少正斜杠。

不,每个目录都以初始斜杠的形式进行重写(参见日志)。

重写规则 %{REQUEST_URI} !.php

这可能是打字错误,应该是RewriteCond %{REQUEST_URI} !.php

我没有解决方案,但我建议加快速度,RewriteLogLevel直到你能看到发生了什么。

编辑:我不认为这是 mod_rewrite。您的 apache 配置中的其他内容导致了此问题。

相关内容