Php 重写不';不行?

Php 重写不';不行?,php,.htaccess,Php,.htaccess,我正试图在我的000webhost帐户上的htaccess文件中编写重写规则,但我找不到使其工作的方法 所有文件都上载到根目录(public_html)。.htaccess文件也位于同一目录中 在URL地址栏中,我看到如下内容:domain.com/index.php?city=London 我需要将此更改为domain.com/city/London 但是通过htaccess文件似乎什么都不起作用 这是我的htaccess代码: <IfModule mod_rewrite.c> R

我正试图在我的
000webhost
帐户上的htaccess文件中编写重写规则,但我找不到使其工作的方法

所有文件都上载到根目录(public_html)。
.htaccess
文件也位于同一目录中

在URL地址栏中,我看到如下内容:
domain.com/index.php?city=London

我需要将此更改为
domain.com/city/London

但是通过
htaccess
文件似乎什么都不起作用

这是我的htaccess代码:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /

RewriteRule ^city/([^/]*)$ /index.php?city=$1 [L]
</IfModule>

重新启动发动机
重写基/
重写规则^city/([^/]*)$/index.php?city=$1[L]

任何帮助都会很好。

您的htaccess工作正常。在这种情况下,用户将访问页面
domain.com/index.php?city=LondonYou
您可以重定向他。按标题位置

 header("Location: city/".$_GET['city']);
现在您只需要知道,用户何时可以通过htacces访问,何时不可以。用点小把戏吧

RewriteRule ^city/([^/]*)$ /index.php?city=$1&accessByHtaccess [L]
有条件的

 if(!$_GET['accessByHtaccess ']){
   header("Location: city/".$_GET['city']);
 }

要获得正确的“好的url”,您需要将丑陋的url重定向到好的url,并在内部将好的url重写到丑陋的、实际工作的url。你已经有了内部重写

从Apache2.3.9开始,您可以使用以下解决方案。
END
-标志在早期版本中不可用,使用时会引发内部服务器错误。将
R
更改为
R=301
,使重定向永久化。只有当所有重定向和重写都按照您的要求工作时,才可以执行此操作,因为浏览器将缓存永久重定向。结束标志将完全停止重写,并将阻止无限循环

RewriteEngine on
RewriteBase /

RewriteCond %{QUERY_STRING} city=([^&]*)
RewriteRule ^index\.php$ /city/%1? [R,L]

RewriteRule ^city/([^/]*)$ /index.php?city=$1 [END]
在Apache的早期版本中,您需要使用hack。这是可行的,因为
%{THE_REQUEST}
仅在外部请求中可用,而在重写url时不可用:

RewriteEngine on
RewriteBase /

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/index\.php\?city=(.*)\s [NC]
RewriteRule ^ city/%1? [R,L]

RewriteRule ^city/([^/]*)$ /index.php?city=$1 [L]

请注意,我无法在此计算机上测试这两个重写规则,但我确信我没有输入错误。

尝试将
*
替换为
+
。您确定服务器允许您从.htaccess文件更改配置吗?您可以通过将一些垃圾放入该文件并查看是否会出现错误500来检查它。@M1K1O,这就成功了,但正如deceze在下面提到的那样,我必须在地址栏中写入city/london才能看到它!如果你明白我的意思,它不会自动完成的!有什么想法吗?我已经使用了你的第二个代码,它几乎可以工作,但在地址栏中显示domain.com/city/london?city=london。我需要它显示domain.com/city/london。我是否做错了什么或遗漏了什么?在第一条重写规则后面添加一个尾随的
。这将清除查询字符串。我现在在答案中改变了它。