2012-07-27 62 views
0

这是我在我的开发环境至今:的.htaccess重写“/book.php?id=1234”到“/电子书/ 1234”

php_value error_log log/php.log 
php_value display_errors 1 
php_value magic_quotes_gpc Off 

RewriteEngine On 

# remove slash 
RewriteCond %{REQUEST_FILENAME} !-d 

# file.php to /file 
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/ 
RewriteCond %{REQUEST_URI} !^/ajax.php 
RewriteRule ^(.+)\.php$ http://localhost/$1 [R=301,L] 

# /file to file.php 
RewriteRule ^([^/.]+)$ $1.php [L] 

我已经尝试了很多变种这条规则,但我总是得到一个500错误:

RewriteRule ^(.*)$ /book.php?url=$1 [L] 

而且这是在我的Apache的error.log中:

[Fri Jul 27 19:56:51 2012] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace. 

我缺少什么,为什么重定向循环?

+0

此外,有没有一种使规则完全独立于域的方法?我想避免在本地/ qa/prod环境中更改此文件 – agbb 2012-07-27 23:09:29

+1

或仅仅是'RewriteRule^book /([^ /] *)$ /book.php?id=$1 [L]'。 最后但并非最不重要的,尝试添加:'RewriteBase /' – 2012-07-31 22:30:27

回答

3

您的RewriteRule正如书面似乎试图做你的问题标题说的相反。你说,你要htaccess rewrite /book.php?id=1234 to /book/1234,但你的RewriteRule

RewriteRule ^(.*)$ /book.php?url=$1 [L] 

是添加查询字符串参数。

下重写规则将改写rewrite /book.php?id=1234 to /book/1234

RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ 
RewriteRule ^book\.php$ /book/%1? [L] 

此外,如果你真的想要走另一条路,即改写/book/1234/book.php?id=1234以下应该做的是:

RewriteRule ^book/(.*)$ /book.php?id=$1 [L] 
相关问题