web服务器是Apache。我想重写URL,这样用户就不会知道实际的目录。例如:原始URL:
www.mydomainname.com/en/piecework/piecework.php?piecework_id=11
预期URL:
Piework.mydomainname.com/en/11
我在.htaccess中添加了以下语句:
RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]
RewriteRule ^(w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]当然,我用我的域名代替了我的域名。.htaccess放在站点根目录中,但是当我访问piework.mydomainname.com/en/11时,我得到了“对象未找到”(当然,我用我的域名替换了mydomainname )。
我在.htaccess中添加了以下语句:
RewriteRule ^/(.*)/en/piecework/(.*)piecework_id=([0-9]+)(.*) piecework.mydomainname.com/en/$3当然,我用我的域名代替了我的域名。.htaccess放在站点根目录中,但是当我访问piework.mydomainname.com/en/11时,我得到了“对象未找到”(当然,我用我的域名替换了mydomainname )。
怎么了?
发布于 2010-08-04 00:40:02
尝试在vhost或server中使用RewriteLog,以检查重写过程。现在,您似乎只是猜测mod_rewrite所做的事情。
通过使用RewriteLogLevel,可以修改日志记录的扩展。首先,我推荐第5级。
PS:修改配置后,不要忘记重新加载/重新启动服务器。
发布于 2010-03-18 03:10:28
你在倒着做。这个想法是,你会给人们友好的地址,重写规则会将请求指向这个友好的、不存在的页面到真正的页面,而他们却看不到它。所以现在只有当他们进入丑陋的URL时,它才能处理好该做什么,但是您正在输入友好的URL。由于在人们直接放置友好URL时不存在规则,apache会查找它并说“对象未找到”
因此,增加一行:
RewriteRule piecework.mydomainname.com/en/(*.) ^/$3/en/piecework/$3?piecework_id=([0-9]+)(.*)对不起,这是非常正确的,但基本的想法是,如果他们放入您喜欢的URL,Apache就可以重定向到真正的页面,而浏览器不会看到它。
更新
我很困才能正确地做regex,所以我已经尽了最大的努力让你的例子四处走动,对不起。首先,我会尝试一些更简单的东西,先把基本概念弄下来。试试这个:
RewriteRule www.mydomainname.com/en/piecework/piecework\.php\?piecework_id\=11 piecework.mydomainname.com/en/11至少,如果您遇到错误,就更容易看出什么不起作用了。
发布于 2010-03-18 03:11:31
下面是对正在发生的事情的简要概述:
RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]首先,问号应该在结尾。
$1应该匹配任何不是'www‘0或1次的东西。
$2匹配任何不是字符1或更多次的东西,理论上这将匹配一个空白,但很可能永远不会匹配任何东西。
然后,在这两个组之后,它需要'.mydomainname.com‘。
您的前两个条件是寻找两个独立的分组。
我不清楚您是如何设置您的结构的,但是下面是我如何根据您最初的和预期的URL来编写它:
RewriteCond %{HTTP_HOST} !^www\.mydomainname\.com$ [NC]
RewriteCond %{HTTP_HOST} ^(\w+)\.mydomainname\.com$ [NC]
RewriteRule ^(\w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]基本上,您的第一个条件是确保它不是以'www‘开头的URL (让它成为一个单独的规则就更容易了)。第二个条件是检查可能出现在域名前面的任何单词。然后重写规则将适当地重定向它。
去掉你问题中的最后一条.htaccess线.
如果我打错了,请谁来纠正我。我不记得你是否必须在“w”和“d”前面加上“\”,但我还是把它们包括在内。
https://stackoverflow.com/questions/2467302
复制相似问题