我用了一个stackoverflow的答案来想出我想要做的。 我想请求http://myserver.com/book/1234实际显示内容forms的PHP文件http://myserver.com/book.php?id=1234
所以我的.htaccess看起来像这样:
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ RewriteRule ^book/(.*)$ /book.php?id=$1 [L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [L]
注意底部的两行允许我使用像http://myserver.php/login这样的url实际上拉起http://myserver.php/login.php这是正确的。 但是当我尝试调用http://myserver.com/book.php?id=1234时出现500错误。
你的问题似乎有矛盾的陈述,但假设这种说法
我想请求http://myserver.com/book/1234实际显示内容forms的PHP文件http://myserver.com/book.php?id=1234
是你想要的。
如果您要求http://myserver.com/book.php?id=1234 – 那么您的服务器将根据您当前的.htaccess翻出来。 原因是你只应该执行这个指令
RewriteRule ^book/(.*)$ /book.php?id=$1 [L]
在某些情况下,例如,如果URL不是真实的文件或目录。
这个指令
RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
告诉Apache不仅在请求有forms时进行重写
some_URI?id=some_number
但实际上只有当请求具有这种forms时,重写才会发生。
当请求是http://myserver.com/book.php?id=1234 ,可以防止发生重写
RewriteCond %{REQUEST_FILENAME} !-f
那么你的.htaccess应该看起来像
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^book/(.*)$ /book.php?id=$1 [L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [L]
我只是在本地testing,它的工作原理。 确保你的apache.conf允许你在.htaccess文件中指定的覆盖:
Options +FollowSymLinks -MultiViews RewriteEngine On RewriteBase / RewriteCond %{REQUEST_URI} ^\/book\/([0-9]+)$ RewriteRule ^ /book.php?id=%1 [R,L] RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^ %{REQUEST_URI}.php [L]