我正在开发一个项目,所有页面都需要有一个querystring假定id。例如以下页面:
我正在使用以下.htaccess来使我的网址更漂亮。
RewriteEngine On
## BEAUTIFUL URL
DirectoryIndex default.php
Options -Multiviews -Indexes +FollowSymLinks
#RewriteBase /
DirectorySlash off
# remove trailing slash
RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]
# rewrite /dir/file?query to /dir/file.php?query
RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php]
此代码将进行以下转换:
example.com/alfa.php?id=1 to example.com/alfa?id=1
假设X.php每次都在改变(X)但id总是不变的,.htaccess文件的最佳内容是什么?
我尝试了几种方法,但最好的方法是什么?
还有一件事,如何将网址转换为example.com/alfa/1
和example.com/beta/30
答案 0 :(得分:0)
您正试图在规则的正则表达式模式中匹配查询字符串(?
之后的所有内容)。查询字符串不是该匹配的一部分,只是URI。但是因为你不想触及查询字符串,所以不要匹配它,因为它会自动附加:
RewriteEngine On
## BEAUTIFUL URL
DirectoryIndex default.php
Options -Multiviews -Indexes +FollowSymLinks
#RewriteBase /
DirectorySlash off
# remove trailing slash
RewriteRule ^(.*)\/$ $1 [R=301,L]
# rewrite /dir/file?query to /dir/file.php?query
RewriteRule ^([\w/-]+)$ $1.php [L,T=application/x-httpd-php]
example.com/alfa/1
和example.com/beta/30
:
RewriteCond %{THE_REQUEST} [A-Z]{3,9}\ /([\w/-]+)(\.php)?\?id=([0-9]+)
RewriteRule ^ /%1/%3 [L,R=301]
RewriteRule ^([\w/-]+?)/([0-9]+)$ $1.php?id=$2 [L,QSA,T=application/x-httpd-php]
你可以尝试做的其他事情是摆脱你的规则,只使用你已关闭的Multiviews
。多视图和mod_negotiation是为这样的东西做的。