【问题标题】:htaccess rewriterule for profile.php query用于 profile.php 查询的 htaccess 重写器
【发布时间】:2020-08-04 23:28:40
【问题描述】:

我正在尝试为个人资料页面编写.htaccess RewriteRule。我希望规则查询用户配置文件的 SQL 数据库,如果该数据返回结果以加载 profile.php 页面。示例:

  • www.example.com/username
  • 或www.example.com/user.name
  • 或www.example.com/user.name123等...

但是,我还有其他页面,例如 /login、/registration、/、/chat 等等。每次我尝试某些东西时,我都会遇到问题。

我尝试了以下方法:

RewriteEngine On
RewriteRule ^(login)$ login.php [QSA]
RewriteRule ^(logout)$ logout.php [QSA]
RewriteRule ^([\w-]+)/?$ profile.php?pid=$1 [L,QSA]

我正在尝试尽可能多地学习,但我不理解正则表达式的语法和条件。上面的规则让我可以使用之前的所有页面,但它会捕获profile.php 页面中的所有其他内容。我做错了什么?

【问题讨论】:

  • 我不明白你,你是想在 htaccess 中执行 SQL 吗?或者你想在那个页面上允许一个 sql 查询?
  • @Nix,感谢您的回复。如果我没有解释清楚,我很抱歉。所以,我想要做的是使用配置文件名称('username'、'user.name' 等)来执行查询。如果查询有 0 返回以显示 404 页面,除非该页面确实存在。示例:(登录指向 login.php,但阳光指向任何内容,robert.sexton 应该显示给我。)。我不善于沟通所以,如果我解释得不好,我会尽力而为。
  • 你在这里缺少 RewriteCond,你为什么不通过你的 php 代码来实现呢?在页面顶部您可以执行查询,如果结果为空,您可以回显 404 并退出进一步处理
  • @Nix,在你提出问题后我也在想同样的事情。我想我可以使用查询,如果它返回 0,我可以让 PHP 标头重定向。规则 RewriteRule ^([\w-]+)/?$ profile.php?pid=$1 [L,QSA] 确实有效,但它不能获取所有字符。我只能用一个词来完成所有工作,比如 user.name、user.name123 等。我在看这里:httpd.apache.org/docs/2.4/rewrite/intro.html 和 hostwinds.com/guide/defining-regex-characters-htaccess
  • @Nix,我想我明白了。你能验证一下吗?我正在使用这个: RewriteRule ^([\w-.*]+)/?$ profile.php?pid=$1 [L,QSA]

标签: apache .htaccess centos


【解决方案1】:

请尝试以下正则表达式,希望它能解决您的问题。

^([\w]+|[\w-]+\.+[\w]+)$

您始终可以使用此link 来测试您的正则表达式。

【讨论】:

  • 虽然这也会捕获对profile.php 本身的请求(“看起来像”/user.name)并重写自身,从而导致profile.php?pid=profile.php&pid=username - 第二个pid 基本上覆盖了第一个pid,所以它似乎可以按要求工作。但是,除非启用了 MultiViews,否则 /login 和 /logout 等也将被重写为 profile.php,因为早期指令中缺少 L 标志。但是如果启用了 MultiViews,那么附加文件扩展名的指令基本上会被忽略。
【解决方案2】:

在你的 .htaccess 文件中试试这个

RewriteEngine On 
RewriteRule ^([a-zA-Z0-9-/]+)$ profile.php?pid=$1

确保您在 profile.php 中设置了某些条件来匹配参数,如果不匹配,则会显示错误消息或将您重定向到 404 页面 那会很好

【讨论】:

  • Parth,感谢您的回复。我试了一下你的解决方案,但它只是给了我默认的 404 页面。个人资料页面确实有一个 echo $_GET['pid'] 以确保它获取变量但它不起作用。感谢您的帮助!
  • RewriteRule ^([\w-]+)/?$ profile.php?pid=$1 [L,QSA] - 这个规则似乎是我正在寻找的重点,但它是没有捕捉到所有字符。它适用于用户名,但不适用于 user.name 或 user.name123 等。我想我可以使用它并进行查询,如果它不存在使用 PHP 标头重定向到 404 页面?
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2013-02-19
相关资源
最近更新 更多