我一直在网上搜索,还没有找到解决这个问题的方法。我希望你能对这种情况有所了解。
我的索引文件设置如下:
<header></header>
<div id="main">
<?php
if(isset($_GET["p"])) $p = $_GET["p"];
else $p = "home";
if(file_exists("pages/{$p}.php")) include("pages/{$p}.php");
?>
</div>
这使我使用?p=contact
href加载我的页面。
说我想显示用户个人资料。然后我在“pages”文件夹中创建一个子文件夹,创建相对路径pages/users/profile.php
,从而创建href ?p=users/profile&uid=5
。但这留下了一个丑陋的URL(以及SEO评级)。
如何将该网址重写为/users/profile/5
?
修改 我尝试了以下内容,产生了HTTP 500:
RewriteRule ^([^/]*)/([^/]*)$ /?p=$1&uid=$2 [L]
编辑:我的.htaccess文件,直接位于根文件夹中:http://pastie.org/2268239
第338行是我想要实现的目标(目前只是评论)。
答案 0 :(得分:2)
对于您的情况,最简单的答案是将其添加到.htaccess文件中
RewriteEngine on
RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ /index.php?$1 [L]
这会将您网域上的所有流量重定向到index.php文件。
然后,您可以使用$ _SERVER [“REQUEST_URI”]中的uri确定脚本中的操作
答案 1 :(得分:2)
通过添加以下三行,我达到了预期的效果:
RewriteRule ^([a-zA-Z]+)$ index.php?p=$1 [L]
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)$ index.php?p=$1/$2 [L]
RewriteRule ^([a-zA-Z]+)/([0-9]+)$ index.php?p=$1&uid=$2 [L]
这样我就可以访问/contact
,/users/index
和/users/profile/5
。
答案 2 :(得分:1)
我不是一个骗子的人,但我在重写时试过这个。
RewriteRule ^/(.+)/([^/]+)$ /index.php?p=$1&uid=$2 [L]
在这种情况下,对于p
参数,你要查找到最后一个斜杠的所有字符,所以这的第一部分需要任何东西,否则它将停在第一个斜杠(用户改为用户/个人资料)。
然后它会查找斜杠并保持(不斜线)。 (.+)
将是贪婪的,所以它会在结束前一直到最后一个斜杠。
然后我发现最后一部分不需要避免斜线。由于第一部分是贪婪的,因此显式/
斜杠将成为最后一个斜杠。所以它更简单:
RewriteRule ^/(.+)/(.+)$ /index.php?p=$1&uid=$2 [L]
我喜欢.+
要求一些东西,至少在第一次搞清楚这些时。如果稍后您知道它们可以是可选的,则可以.*
,但通常最终会成为不同的页面或不同的规则。
这些规则确实希望所有网址都采用这种格式,这就是您所要求的。但也许它有点太抢,所以它可以排除真正有.htm或.php或其他什么的网址。
RewriteRule ^/(.+)/([^.]+)$ /index.php?p=$1&uid=$2 [L]
这会查找最后一个斜杠的内容,然后查找没有圆点的任何内容。如果它有一个点,这将不适用。因此,如果它是一个“常规”网址,这将使它不受影响。这可能有助于404问题,以防404页面被此捕获。