没有htaccess的PHP中的URL重写

时间:2010-01-24 11:02:33

标签: php web-hosting

网站正在我们无法访问.htaccess文件的网络主机上运行。但是,我想对用户友好的URL进行URL重写。

e.g。原始网址

www.example.com/file?q=name

预期网址

www.example.com/file/name

6 个答案:

答案 0 :(得分:16)

正如其他人所说,只需使用/index.php/nice/looking/url之类的链接 URL中间的“index.php”可能看起来有点奇怪,但我不认为没有.htaccess可以让它看起来更好

否则,您可以要求您的托管服务商将任何网址重定向到/index.php,以便您可以在网址中使用/index.php来处理网址重写。

然后你可以使用正则表达式匹配来检测要包含的文件 preg_match('@[/]{1}([a-zA-Z0-9]+)@', $_SERVER["PATH_INFO"], $matches) ($ matches将包含数组中url的所有“部分”)

小心包含文件,使用白名单,这样您就可以确定没有人能够加载内部文件。

答案 1 :(得分:5)

正如Alix Axel建议您可以使用

www.example.com/index.php/file/name

然后您将使用$_SERVER['REQUEST_URI']来处理网址。

答案 2 :(得分:4)

您最好的选择是拥有以下网址:

www.example.com/index.php/file/name

你会改写你的PHP代码。

答案 3 :(得分:3)

如果您有Apache服务器且启用了AcceptPathInfo,那么您可以使用您编写的URL。如果/file/name是常规文件,则/file的请求将自动重写为/name,其中 PATH_INFO 值为/file

答案 4 :(得分:1)

这可以单独使用 Apache 配置(httpd.conf 或 apache2.conf)中的语言/内容协商以及重写规则。不需要使用 .htaccess 文件。

在 apache2.conf 文件(或 httpd.conf)中添加 Multiviews 指令、MultiviewsMatch 指令和重写规则

<Directory /var/www/html>
    Options Indexes FollowSymLinks Multiviews
    AllowOverride None
    Require all granted

    RewriteEngine On
    RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
    RewriteRule ^ /%1 [NC,L,R]

    <Files "*.php">
        MultiviewsMatch Any
    </Files>
</Directory>

然后保存文件并重启Apache sudo systemctl restart apache2

如果稍后在 httpd.conf 中指定 Options 指令,则必须为每个站点重复 Multiviews 指令:

<Directory /var/www/html/chocolate.com/>
  Options FollowSymLinks Multiviews
  AllowOverride All
  Require all granted
</Directory>

<Directory /var/www/html/vanilla.com/>
  Options FollowSymLinks Multiviews
  AllowOverride All
  Require all granted
</Directory>

如果您已经以多种语言提供服务,这不会对内容协商产生不利影响。例如,将 example.com/home.php 替换为

<块引用>

home.en.php 主页.fr.php home.de.php

然后在 apache2.conf 中:

AddLanguage fr .fr
AddLanguage de .de
AddLanguage en .en
LanguagePriority fr de en
ForceLanguagePriority Fallback

仍会协商您的语言,但 php 扩展名不会出现在 URL 中。

答案 5 :(得分:-2)

试试这个

www.example.com/file?q=name

www.example.com/name(优于www.example.com/file/name

从项目根文件夹中打开.htaccess并添加此代码

Options +FollowSymLinks

RewriteEngine On
RewriteRule \.(js|css|jpe?g|png|gif)$ - [L]


RewriteRule "^([ \w-]+)/?$" /file?q=$1 [L,QSA]

这解决了您的问题。查看帖子如何rewrite URL in .htaccess