Web服务器是Apache。我想重写URL,以便用户不知道实际目录。例如: 原始网址:
www.mydomainname.com/en/piecework/piecework.php?piecework_id=11
预期网址:
piecework.mydomainname.com/en/11
我在.htaccess中添加了以下语句:
RewriteCond %{HTTP_HOST} ^(?!www)([^.]+)\.mydomainname\.com$ [NC]
RewriteRule ^(w+)/(\d+)$ /$1/%1/%1.php?%1_id=$2 [L]
当然我用我的域名替换了mydomainname。 .htaccess被放置在站点根目录中,但是当我访问piecework.mydomainname.com/en/11时,我得到了“找不到对象”。(当然我用我的域名替换了mydomainname。)
我在.htaccess中添加了以下语句:
RewriteRule ^/(.*)/en/piecework/(.*)piecework_id=([0-9]+)(.*) piecework.mydomainname.com/en/$3
当然我用我的域名替换了mydomainname。 .htaccess被放置在站点根目录中,但是当我访问piecework.mydomainname.com/en/11时,我得到了“找不到对象”。(当然我用我的域名替换了mydomainname。)
怎么了?
答案 0 :(得分:2)
尝试在vhost或server-conf中使用RewriteLog以检查重写过程。现在你似乎猜到了mod_rewrite的作用。
通过使用RewriteLogLevel,您可以修改日志记录的扩展名。对于初学者,我建议等级为5。
PS:修改配置后不要忘记重新加载/重启服务器。
答案 1 :(得分:0)
你正在倒退。我们的想法是,您将为人们提供友好的地址,重写规则会将请求发送到这个友好的,不存在的页面,而不会让他们看到它。所以现在你只能处理当他们转到丑陋的URL时要做什么,但是你要放入友好的URL。因为当人们直接放置友好URL时没有规则,apache会查找它并说“找不到对象”
所以添加一行:
RewriteRule piecework.mydomainname.com/en/(*.) ^/$3/en/piecework/$3?piecework_id=([0-9]+)(.*)
很抱歉,这是非常正确的,但基本的想法是,如果他们输入您喜欢的URL,Apache就可以在没有浏览器看到的情况下重定向到真实页面。
我正好困倦地正确地使用正则表达式,所以我只是尽力推动你的例子,抱歉。我会先尝试一些更简单的方法,先把基本概念放下来。试试这个:
RewriteRule www.mydomainname.com/en/piecework/piecework\.php\?piecework_id\=11 piecework.mydomainname.com/en/11
至少,如果出现错误,将更容易看到哪些不起作用。
答案 2 :(得分:0)
以下是对正在发生的事情的快速概述:
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'前面加上'\',但我还是把它包括在内。