0

我正在开发一个项目,所有页面都需要有一个查询字符串假定 id。例如以下页面:

  1. example.com/alfa.php?id=1
  2. example.com/beta.php?id=30
  3. exapmle.com/gamma.php?id=50

我正在使用以下 .htaccess 使我的 URL 更美观。

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 文件的最佳内容是什么?

我尝试了几种方法,但是最好的方法是什么?

还有一件事,如何将 URL 转换为example.com/alfa/1ANDexample.com/beta/30

4

1 回答 1

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/1example.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您已关闭的 。Multiviews 和 mod_negotiation 就是为这样的东西而设计的。

于 2013-09-20T17:38:56.527 回答