通过替换GET变量缩短URL

时间:2012-07-06 12:55:28

标签: php .htaccess

我有一个显示新闻内容的网页。页面的URL看起来像 example.com/news.php?newsid=iphone4-releases。我希望通过以下网址访问该网页:example.com/news/iphone4-releases

我在.htaccess文件中进行了这些更改

RewriteCond %(REQUEST_FILENAME) !-d [OR]
RewriteCond %(REQUEST_FILENAME) !-f [OR]
RewriteCond %(REQUEST_FILENAME) !-l

RewriteRule .* - [L]

RewriteRule ^(.*)$ http://example.com/news.php?newsid=$1 [NC]

此代码实际上替换了URL,但我希望保留不带GET变量的相同URL。此外,使用此方法,网址变为example.com/iphone4-releases,但我想要example.com/news/iphone4-releases

3 个答案:

答案 0 :(得分:1)

这样做,假设您只在文章名称中使用a-Z,数字和短划线:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^news/([a-zA-Z0-9\-]*)$ /news.php?newsid=$1 [NC]

修改

此链接说明了参数: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond

关于-l:

  

' - l'(是符号链接)将TestString视为路径名并进行测试   它是否存在,是一种象征性的联系。

数字将在此示例中有效(例如/ news / iphone2003-new-launch)

对不起,但我很着急:)

答案 1 :(得分:1)

您不能指望省略GET变量并使用.htaccess执行303重定向,因为重定向将丢失您的变量。您可以做的是将一个带有POST的表单提交到您将重定向到的页面,并从该页面创建一个符号链接到真正的PHP脚本,然后然后创建一个重写规则来重定向客户端的浏览器。

以上是您的上述重定向,其中包含添加的/news/部分:

RewriteEngine On
RewriteBase /
RewriteCond %(REQUEST_FILENAME) !-d [OR]
RewriteCond %(REQUEST_FILENAME) !-f [OR]
RewriteCond %(REQUEST_FILENAME) !-l

RewriteRule .* - [L]

RewriteRule ^(.*)$ news/news.php?newsid=$1 [NC]

您也可以仅使用PHP进行重定向:

header("Location: http://www.redirecthere.com");

答案 2 :(得分:0)

也许您需要同时删除[OR],因为您希望所请求的文件不是文件而不是目录而不是符号链接

RewriteCond %(REQUEST_FILENAME) !-d
RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-l

RewriteRule ^/(\w+)/(.*?)/?$      $1.php?newsid=$2 [NC,L]

并且您不需要整个域都在您的规则中