我有以下代码:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^p/(.*)$ /p.php?id=$1 [R=301,L]
从功能上讲,上面的代码可行。但网址从p/X
更改为p.php?id=X
。我怀疑问题在于[]之间的值,我尝试了不同的值,在同一个对象上观察其他问题,但没有运气。
我做错了什么?
答案 0 :(得分:1)
删除R
标志,因为这会导致浏览器中的外部重定向。
Options +FollowSymLinks -MultiViews
RewriteEngine On
# external redirect from actual URL to pretty one
RewriteCond %{THE_REQUEST} \s/+p\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /p/%1? [R=302,L,NE]
RewriteRule ^p/(.+)$ /p.php?id=$1 [NC,QSA,L]
另请注意禁用MultiViews
选项。在MultiViews
之前运行的Apache's content negotiation module
使用选项mod_rewrite
,并使Apache服务器匹配文件扩展名。因此/file
可以在网址中,但它会投放/file.php
。
还添加了QSA
标志。 QSA
(查询字符串追加)标志在添加新查询参数时保留现有查询参数。