【问题标题】:Replacing question marks and equal signs with htaccess用 htaccess 替换问号和等号
【发布时间】:2013-09-06 03:33:16
【问题描述】:

我正在尝试替换问号和等号,以便可以使用如下 URL:

http://www.mydomain.com/categories/id/23/name/category-name

上面的 url 将被内部重定向到 http://www.mydomain.com/categories?id=23&name=category-name

我正在使用这个 .htaccess:

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

# external redirect from /view.php?id=1 to /view/id/1
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+([^.]+)\.php\?([^=]+)=([^\s&]+) [NC]
RewriteRule ^ /%1/%2/%3? [L,R=301]

# internal forward from /view/id/1 to /view.php?id=1
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /$1.php?$2=$3 [L,QSA]

但它没有按预期工作。当我转到 http://www.mydomain.com/categories/id/23/name/category-name 时,我收到 500 内部服务器错误。为什么?我做错了什么?

更新代码

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

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?(.*)$ $1/$2=$3&$4 [L]

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

【问题讨论】:

  • 查看 webservers error.log 以了解该 500 的详细信息。
  • 你的 apache 错误日志是怎么说的?
  • 它说“由于可能的配置错误,请求超出了 10 个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“LogLevel debug”来获得回溯。好像我有一个无限循环?
  • 你的 htaccess 文件在哪里?
  • 即使没有错误,http://www.mydomain.com/categories/id/23/name/category-name 也永远不会匹配,因为您将模式限制为只有 3 个 / 和一个可选的。所以它最多只能匹配http://www.mydomain.com/categories/id/23/,然后当你重写你的第一条规则时很可能会循环到死。

标签: php apache .htaccess url url-rewriting


【解决方案1】:

这个规则应该注意用=递归替换每个/,最后使它成为一个很好的查询字符串:

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?(.*)$ $1/$2=$3&$4 [L]

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

您需要注释掉或删除这条规则:

# RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /$1.php?$2=$3 [L,QSA]

更新:您的 .htaccess 需要重新排序和一点点调整。这应该有效:

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteBase /mydomain/

RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?(.*)$ $1/$2=$3&$4 [L]

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

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

【讨论】:

  • 这给了我同样的问题:“由于可能的配置错误,请求超出了 10 个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“LogLevel debug”来获得回溯。并且浏览器显示“[处理此指令时发生错误]”
  • 我在发布之前测试了这段代码。请再次发布您的完整 .htaccess。
  • 感谢您的帮助。根据您的建议,我用完整的代码更新了我原来的问题。
  • 好的,谢谢,让我用你的完整代码测试一下,然后回复你。
  • 重新排序后,我在所有页面上都收到 404... 为什么?我不明白...在我的错误日志中,我有类似的内容:“文件不存在 C:/xampp/htdocs/mydomain/categories”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
相关资源
最近更新 更多