在发表任何评论之前,我知道有很多关于这个主题的帖子,但是它们似乎都没有解决我的问题,这就是我开始这个帖子的原因。
所以,我的网站中有一个名为project.php
的网页,用于GET
查询,如下所示:project.php?id=12
我想要一个.htaccess文件,将给定的网址转换为localhost/MyWeb/project/id/12/
。我确实关注过每个关于该主题的帖子,但它们似乎都没有效果。
此外,我希望我的所有.php
和.html
文件只显示其名称,即localhost/MyWeb/index.php/
变为localhost/MyWeb/index/
和{{1} }变成localhost/MyWeb/sub1/sub2.php
。
修改
我之所以没有首先加入我的作品是因为我认为这不会有任何帮助。但这是:
localhost/MyWeb/sub1/sub2/
答案 0 :(得分:2)
首先,您在子目录(MyWeb
)之外操作,这意味着您需要设置RewriteBase
。此外,您需要确保将.htaccess
文件放在该子目录中,而不是放在localhost文档根目录中。
因此,在RewriteEngine on
下方,插入以下行:
RewriteBase /MyWeb/
接下来,您声明要将project.php?id={id}
转换为project/id/{id}
,但您的代码会忽略/id/
段。我还注意到你有两个规则,第二个规则与你的问题相矛盾,所以我只会向你展示你需要为第一条规则做出的改变,直到你澄清第二条规则是什么为止。
要使项目URI有效,请将第一个规则更改为:
RewriteRule ^project/id/([0-9]+)/?$ project.php?id=$1 [QSA,L]
这将匹配您想要的URI,并带有可选的尾部斜杠。我还添加了QSA
标志,它将任何额外的查询字符串参数附加到重新连接的URI,以及L
标志,如果规则匹配则停止处理。
接下来,要从URI中省略.php
或.html
,请将最后三行更改为以下内容:
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^([^\.]+)$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^([^\.]+)$ $1.html [L]
当您向localhost/MyWeb/index
发出请求时,Apache会检查localhost/MyWeb/index.php
或localhost/MyWeb/index.html
是否存在,然后会先找到它找到的任何一个。
如果您同时拥有PHP和HTML文件,那么将提供PHP文件,而不是HTML文件。如果您更喜欢提供HTML文件,请交换两个块。
不幸的是,我不知道强制使用尾随斜杠的好方法,特别是因为检查它们存在的条件。换句话说,如果你请求sub2/
并使用trailins斜杠,它将无效,因为它需要检查sub2/.php
是否存在,而不是。{/ p>
更新为了获得额外的好处,请将这两个块放在您之前设置的新RewriteBase
下方,以便将旧URI重定向到新URI,同时允许重写新URI到还在工作:
RewriteCond %{THE_REQUEST} \/project\.php\?id=([0-9]+) [NC]
RewriteRule ^ project/id/%1/ [R=302,L,QSD]
RewriteCond %{THE_REQUEST} \/MyWeb/(.+)\.(php|html)
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ %1 [R=302,L]
供参考,这是完整的文件:http://hastebin.com/gacapesoqe.rb