【问题标题】:.htaccess links working, but no GET variables.htaccess 链接工作,但没有 GET 变量
【发布时间】:2016-09-21 09:32:17
【问题描述】:

在我的一个网站上,.htaccess 用于链接,但 php 文件未检测到 GET 方法。

我的 .htaccess

ErrorDocument 404     /404
ErrorDocument 500     /500

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
RewriteRule ^(resources)($|/) - [L]
RewriteRule ^user/([^/]*)$ /users.php?user=$1 [L]
RewriteRule ^dev/([^/]*)$ /dev.php?type=$1 [L]
RewriteRule ^users/([^/]*)$ /users.php?view=$1 [L]
RewriteRule ^users/edit/([^/]*)$ /users.php?view=edit&id=$1 [L]
RewriteRule ^settings/([^/]*)$ /settings.php?view=$1 [L]
RewriteRule ^groups/([^/]*)$ /groups.php?view=$1 [L]
RewriteRule ^groups/edit/([^/]*)$ /groups.php?view=edit&id=$1 [L]
RewriteRule ^groups/permissions/([^/]*)$ /groups.php?view=permissions.php&id=$1 [L]
RewriteRule ^page/([^/]*)$ /page.php?view=$1 [L]

这在 domain.com 上对我有用,但在 domain.com/subdir 上不再适用 不仅如此,难道没有更好的方法来处理 get 请求重写,因此我不必为每个处理 GET 请求的 php 文件添加规则?

提前谢谢你。

【问题讨论】:

  • 您可以将所有内容重写为index.php,并为您要使用的控制器和操作添加其他变量。
  • 谢谢@Bert,但这对我不起作用。 Jeroen 感谢您与我一起思考,我将制定一个关于如何实现这一目标的计划
  • @dream_machine 该问题是关于在重写后引入 GET 变量。据我了解,这个问题是关于 preserving 获取变量。
  • 当然,您的规则只适用于以 user/、dev/ 等开头的 URL。您如何将其扩展到子目录?我假设您希望支持 domain.com/subdir/user/… 形式的 URL。可能扩展捕获子目录的规则就足够了。

标签: php regex apache .htaccess mod-rewrite


【解决方案1】:

你需要关闭MultiViews选项,你也可以将一些类似的规则合并为一个:

ErrorDocument 404     /404
ErrorDocument 500     /500
Options +FollowSymLinks -MultiViews

RewriteEngine On

RewriteRule ^(resources)($|/) - [L]

RewriteRule ^user/([^/]+)/?$ /users.php?user=$1 [L]

RewriteRule ^dev/([^/]+)/?$ /dev.php?type=$1 [L]

RewriteRule ^(users|settings|groups|page)/([^/]+)/?$ /$1.php?view=$2 [L,QSA,NC]

RewriteRule ^(users|groups)/(\w+)/([^/]+)/?$ /$1.php?view=$2&id=$3 [L,QSA,NC]

# To internally redirect /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

【讨论】:

  • 我必须在父目录的 .htaccess 中添加 Options +FollowSymLinks -MultiViews 。结合这个对我有用。谢谢!
【解决方案2】:

这样试试吧,

RewriteEngine on

#if you want it to use for sub dir
RewriteBase /subdir/

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

#below for url which only have view as parameter
RewriteRule ^([\w]+)/([\w]+)$ $1.php?view=$2 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^user/([^/]*)$ users.php?user=$1
RewriteRule ^dev/([^/]*)$ dev.php?type=$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)/edit/([^/]*)$ /$1.php?view=edit&id=$2 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^groups/permissions/([^/]*)$ /groups.php?view=permissions.php&id=$1 [QSA,L]

【讨论】:

  • 感谢您的回复,可悲的是,这对我也不起作用。
  • 请解释一下具体问题是什么?哪个网址不起作用。
  • 我添加了 RewriteRule ^settings/([^/]*)$ /settings.php?view=$1 [L] 但 settings.php 告诉我没有 $_GET['view'] 请求。根本没有 $_GET。
【解决方案3】:

也许你应该把这个文件复制到domain.com/subdir,但这不是很好,你应该考虑使用像symfony这样的php mvc框架,它会顺利解决你的问题,普通php很难扩展。

【讨论】:

  • domain.com/subdir。对于这样的小问题,改变框架似乎不是一个可行的选择......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 2014-02-07
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
相关资源
最近更新 更多