【问题标题】:Mod rewrite for query stringMod重写查询字符串
【发布时间】:2012-10-21 05:59:34
【问题描述】:

Mod Rewrite noob 所以请原谅我的无知,但我想做的只是一个简单的查询字符串删除

来自:http://yourwebsite.com/x?section=y

收件人:http://yourwebsite.com/x/y

我在 .htaccess 中添加我的 mod 重写规则,如下所示:

ErrorDocument 404 /404

Options +MultiViews
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php

RewriteCond %{QUERY_STRING} ^section=(.*)$ [NC]
RewriteRule ^(.*)$ /$1/%1? [R=301,L,NE]

问题是在访问时:

http://yourwebsite.com/x?section=y

我的规则写回如下:

http://yourwebsite.com/x.php/y

漂亮网址中的 .php 非常丑陋,我正在努力摆脱它。

我的模组重写规则有什么问题?

【问题讨论】:

  • 很可能存在文件x.php,因此第一个RewriteRule 匹配并将请求重写为x.php。就像您配置它一样。那么你想做什么呢?
  • x.php 存在。可通过http://yourwebsite.com/x 访问。我希望像http://yourwebsite.com/x?section=y 这样的网址重写为http://yourwebsite.com/x/y。目前,它们被重写为http://yourwebsite.com/x.php/y

标签: mod-rewrite


【解决方案1】:

您很可能正在寻找这样的东西:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d  
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.+)\/(.+)$ /$1.php?section=$2 [L]

RewriteCond %{QUERY_STRING} ^section=(.*)$ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /$1/%1 [R=301,L,NE]

它进行了两次重写:

  1. 请求 x/y 在内部重写为 x.php?section=y
  2. x?section=y 的请求被重定向到x/y

请注意,一个是内部重写,而另一个重定向浏览器以显示一个不那么“丑陋”的 url。

一个提示:如果您可以使用 apaches 重写模块(RewriteLogRewriteLogLevel)的日志记录功能,这将为您提供有关重写过程中实际发生的事情的大量详细信息。

【讨论】:

  • 我不想要point 1。我只想要point 2。我的规则几乎有效,只是我无法摆脱丑陋的 .php。规则应用后x?section=y 看起来像x.php/y
  • 好吧 a) 看看我对你的问题的评论:你用你自己的第一个 RewriteRule 明确配置对 x.php 的重写和 b) 我想说你可以改变它,但是然后x.php 不会被调用,你会得到/x 不存在的错误。
  • 问题:当x/y被请求时,你想要x.php被执行(可能带有参数section=y)还是应该在内部请求x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2011-03-02
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多