htaccess删除.php扩展名和漂亮的URL

时间:2018-09-27 16:02:11

标签: regex .htaccess

我正在尝试同时删除.php扩展名。例如,以“ http://localhost/timetable/login”代替“ http://localhost/timetable/login.php

但也有

http://localhost/timetable/38/”代替 “ http://localhost/timetable/index.php?week=38

我可以使一个或另一个工作,但不能同时工作。我认为这是因为他们之间存在冲突,但我还没有找到足够的进展。

这是我的.htaccess文件:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [NC,L]
RewriteRule ^([0-9]+)$ index.php?week=$2 
RewriteRule ^([0-9]+)/$ index.php?week=$2

如果我在地址栏中输入“ http://localhost/timetable/38”,则将我带到“ http://localhost/38/”,并且出现“找不到对象”错误。

有人知道是什么问题吗?

更新: 我现在可以转到页面,但

echo $_GET['week'];

返回空结果,因此它点燃了“ http://localhost/timetable/40”中的40。

2 个答案:

答案 0 :(得分:0)

尝试获取一周时,您只有一个捕获组。因此应该是$ 1而不是$ 2。

根据this test tool,以下操作应该有效:

RewriteRule ([0-9]+)/?$ index.php?week=$1

我会做这样的事情:

# rewrite if url ends with a number and possibly a slash
RewriteRule ([0-9]+)/?$ index.php?week=$1 [QSA,L] 

# do not append .php if it already ends with .php, other add .php
RewriteCond %{REQUEST_URI} !\.php$ 
RewriteRule ^(.*)$ $1.php [QSA,L]

答案 1 :(得分:0)

您应该考虑将所有输入作为单个字符串路由到某个php文件,而不是对每个输入使用单独的重写规则。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?page=$1 [L,QSA]

然后在您的php文件中,您可以将字符串分隔为输入,并根据需要使用它们。

<?php
$inputs = explode('/', $_GET['page']);