我正在尝试重写我的网址:
RewriteEngine On
RewriteBase /
RewriteRule ^help/(.+)/(.+) help.php?helpid=$2
RewriteRule ^city/(.+)/(.+) city.php?cityid=$2
即使该网址包含预期的格式:http://example.com/help/the-irelevant-title/5/
似乎
isset($_GET['helpid']))
将始终在false
help.php
通常这个系统对我有用。我在这里缺少什么吗?
- 编辑 -
我可以看到这应该有效(或者至少有一个人回答)我在这个问题中添加了更多代码:
完整.htaccess内容
RewriteEngine On
ErrorDocument 500 /oohps.php
ErrorDocument 404 /oohps.php
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
RewriteBase /
RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2 [QSA]
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2 [QSA]
RewriteRule ^login$ login.php
开始使用help.php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
$_GET['noseo'] = true;
include('htmlhead.php');
/* Leemos la id del grupo*/
$selected;
if(isset($_GET['helpid'])){
$selected = $_GET['helpid'];
}else {
echo '<script>alert("Modrewrite fails. Id is missing, id: '.$_GET['helpid'].'");location.href = "/"</script>'; /* Allways returns this*/
}
答案 0 :(得分:3)
正则表达式过于贪婪,第一个.+
匹配斜杠也导致正则表达式的其余部分失败。 [^/]+
正则表达式将匹配斜杠以外的任何内容。
RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2
答案 1 :(得分:2)
使用[QSA]
应该可以转发GET参数。此外,将.+
(贪婪)更改为[^/]+
(意味着任何不是斜线的字符重复1次或更多次),它应该可以解决您的问题。
RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2 [QSA]
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2 [QSA]
它也可以缩短为以下内容:
RewriteRule ^(help|city)/([^/]+)/([^/]+) $1.php?$1id=$3 [QSA]
当替换URI包含查询字符串时,RewriteRule的默认行为是丢弃现有的查询字符串,并将其替换为新生成的查询字符串。使用[QSA]标志会导致查询字符串合并。
考虑以下规则:
RewriteRule /pages/(.+)/page.php?page=$1 [QSA]
使用[QSA]标志,/ pages / 123?one = 2的请求将映射到/page.php?page=123&one=two。如果没有[QSA]标志,相同的请求将映射到/page.php?page=123-也就是说,现有的查询字符串将被丢弃。
答案 2 :(得分:1)
你有两个变量的原因吗?这虽然有效:
RewriteEngine On
RewriteBase /
RewriteRule ^help/([^/\.]+)/([^/\.]+)/?$ help.php?helpid=$2 [L]
RewriteRule ^city/([^/\.]+)/([^/\.]+)/?$ city.php?cityid=$2 [L]
答案 3 :(得分:1)
您可以在根目录中的.htaccess文件中尝试:
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/([^/]+)/[^/]+/([^/]+)/? [NC]
RewriteRule .* %1.php?%1id=%2 [L]
重定向
带有或不带斜线的 http://domain.com/par1/anything/par2
要
http://domain.com/par1.php?par1id=par2
字符串par1
,anything
和par2
被认为是动态的,根据问题中的示例,par1
是PHP脚本的名称,也是重定向查询中key
名称的第一部分。
par1
= 帮助时的示例:
重定向:
http://domain.com/help/the-irelevant-title/5/
致:
http://domain.com/help.php?helpid=5
对于永久重定向,请将[L]
替换为[R=301,L]
虽然我没有测试其他规则并且不知道它们是否按预期工作,但问题中的.htaccess文件应该像这样修改以包含此答案中的规则集:
Options +FollowSymlinks -MultiViews
RewriteEngine On
ErrorDocument 500 /oohps.php
ErrorDocument 404 /oohps.php
RewriteCond %{HTTP_HOST} ^www.domain.com [NC]
RewriteRule ^(.*)$ http://domain.com/$1 [L,R=301]
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^/([^/]+)/[^/]+/([^/]+)/? [NC]
RewriteRule .* %1.php?%1id=%2 [L]
# Next line is a suggested addition to prevent loops.
RewriteCond %{REQUEST_URI} !login\.php [NC]
RewriteRule ^login$ login.php [L]