0

我有一个显示新闻内容的网页。页面的 URL 类似于 example.com/news.php?newsid=iphone4-releases. 我希望可以通过这样的 URL 访问该页面: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。另外,使用这种方法,URL 变成了example.com/iphone4-releases,但我想要example.com/news/iphone4-releases

4

3 回答 3

1

假设您只在文章名称中使用 aZ、数字和破折号,这将是可行的:

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)

对不起,但我很着急:)

于 2012-07-06T13:02:34.933 回答
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");
于 2012-07-06T13:14:47.930 回答
0

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

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

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

而且您不需要整个域都在您的规则内

于 2012-07-06T13:00:22.093 回答