为什么调用此 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 配置中的其他内容导致了此问题。