Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过替换GET变量缩短URL_Php_.htaccess - Fatal编程技术网

Php 通过替换GET变量缩短URL

Php 通过替换GET变量缩短URL,php,.htaccess,Php,.htaccess,我有一个显示新闻内容的网页。页面的URL看起来像 example.com/news.php?newsid=iphone4发行版。我希望可以通过如下URL访问该页面:example.com/news/iphone4 releases 我在.htaccess文件中进行了这些更改 RewriteCond %(REQUEST_FILENAME) !-d [OR] RewriteCond %(REQUEST_FILENAME) !-f [OR] RewriteCond %(REQUEST_FILENAME

我有一个显示新闻内容的网页。页面的URL看起来像
example.com/news.php?newsid=iphone4发行版
。我希望可以通过如下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,但我想保留相同的URL,而不使用GET变量。此外,使用此方法,URL将变为
example.com/iphone4 releases
,但我希望
example.com/news/iphone4 releases
可能您需要同时删除
[或]
,因为您希望请求的文件不是文件,也不是目录,也不是符号链接

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

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

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

假设您的文章名中只使用a-Z、数字和破折号,那么就可以了:

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

此链接介绍有关参数的信息:

关于-l:

“-l”(是符号链接)将TestString视为路径名并进行测试 它是否存在,并且是一个符号链接

在本例中,数字将起作用(例如/新闻/iphone2003新发布)


很抱歉,但我很匆忙:)

您不能期望忽略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");

我的newsid中也使用数字。你能解释一下你为什么要搬走吗-l来自重写条件(以及它的作用)