.htaccess在斜杠后删除所有.php和id作为默认参数

时间:2016-06-08 18:07:36

标签: php apache .htaccess mod-rewrite

我有以下.htaccess文件,可帮助我将http://domain/path/project.php?id=1重写为http://domain/path/project/1

RewriteBase /
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ project.php?id=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ project.php [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^(.*)$ project.php [QSA,NC,L]   

但是我需要以相同的方式替换当前目录中的所有php。我有edit_project.php?id=1delete_project.php?id=1等。id是所有php的默认参数,除了一些。所以我希望htaccess能够做到以下几点。

http://domain/path/*.php?id=1http://domain/path/*/id 当没有id时,它应该看起来像http://domain/path/*,当有其他参数时,它应该看起来像http://domain/path/*?param=value

由于我是.htaccess的新手,所以我们将不胜感激。还请解释一下这是如何工作的。

2 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

RewriteEngine On
RewriteBase /    
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^path/([^/]+)/?([0-9]*)/?$ $1.php?id=$2 [QSA,NC,L]

这会将 / path / file / id 重写为 /file.php?id=id

由于$ 1代表第一组([^/]+)的匹配,而$ 2代表第二组([0-9]*)的匹配

答案 1 :(得分:0)

您可以在根目录中使用这些规则.htaccess:

RewriteEngine On

# redirect /path/file.php?id=123 to /path/file/123
RewriteCond %{THE_REQUEST} /(path/.+)\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /%1/%2? [R=302,L,NE]

# hide .php extension 
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=302,NE,L]

# rewrite /path/file/123 to /path/file.php?id=123
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(path/[^/]+)/([^/]+)/?$ $1.php?id=$2 [QSA,NC,L]

# hide .php extension 
RewriteCond %{DOCUMENT_ROOT}/$1\.php -f
RewriteRule ^(path/[^/]+)/?$ $1.php [NC,L]

确保/path/目录中没有.htaccess。