.htaccess将每个PHP文件的.php替换为/

mmvthczy  于 2023-03-30  发布在  PHP
关注(0)|答案(3)|浏览(162)

我正在尝试让以下功能在没有框架的情况下在PHP中工作。我不想为我做的每个PHP应用程序都要担心设置一个超级复杂的框架。
http://domain.com/sign_up.php becomes http://domain.com/sign_up/
http://domain.com/user.php?id=432 becomes http://domain.com/user/?id=432
或者如果有一种方法可以让它变成http://domain.com/user/432,但我不确定如何在这种情况下处理多个$_GET变量,所以这是可选的。
到目前为止,这一点做得很好:
RewriteRule ^sign_up/([^/]*)$ /sign_up.php?p=$1 [L]
唯一的问题是我必须为我使用的每一个PHP文件做这件事,这可能会变得很多。
什么是一个通用的方法来做所有的php文件?

更新:

这一行工作得很好:
RewriteRule ^(.*)\/$ $1.php [NC]
唯一的问题是它不会自动重定向PHP
例如,我想301自动重定向:
http://domain.com/file.php to http://domain.com/file/
然后呢
http://domain.com/file.php?var1=value&var2=value to http://domain.com/file/?var1=value&var2=value
如果有人能想到一个更好的方法来处理查询字符串值在一个更SEO友好的方式,这将是可怕的!但除此之外,这是工作相当伟大的迄今为止。

更多更新:

现在这是工作:http://domain.com/file/-至-http://domain.com/file.php
这两个都指向同一个页面,并使用htaccess代码:RewriteRule ^(.*)\/$ $1.php [NC]
但是,没有尾随/http://domain.com/file返回未找到页面错误。
我也需要知道如何自动重定向http://domain.com/file.phphttp://domain.com/file/

大部分工作HTACCESS

这个.htaccess工作得很好:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI}  !\.(php|html?|jpg|gif)$
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]
RewriteRule ^(.*)\/$ $1.php [NC]

它唯一不做的是自动重定向,如果他们直接转到http://domain.com/file.php,它不会重定向到http://domain.com/file/,但其他一切都是工作的。

hsgswve4

hsgswve41#

试试这个:

RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d # not a dir
RewriteCond %{REQUEST_FILENAME} !-f # not a file
RewriteCond %{DOCUMENT_ROOT}/$1.php -f # but php exists
RewriteRule ^([^/]+)/([^/]+)?$ $1.php?p=$2 [L]

但是没有/结尾的http://domain.com/file返回一个页面未找到错误。
这是因为除非结尾有/,否则您的规则不匹配。

RewriteRule ^(.*)\/$ $1.php [NC]
                  ^

您可以将?设置为可选,如

RewriteRule ^(.*?)/?$ $1.php [L]

请注意,/前面不需要\。无论有没有它,它都可以工作。
我还需要知道如何将http://domain.com/file.php自动重定向到http://domain.com/file/

# Rewrite original .php request to new URLs
RewriteCond %{THE_REQUEST} \ /([^.]+)\.php [NC]
RewriteRule ^ /%1/ [R,L]

# Resolve the new URLs to .php files
RewriteRule ^(.*?)/?$ $1.php [L]

如果你先让它工作,我们可以看到我们可以做什么关于查询参数。
您的最终htaccess可能看起来像

# Rewrite original .php request to new URLs
RewriteCond %{THE_REQUEST} \ /([^.]+)\.php [NC]
RewriteRule ^ /%1/ [R,L]

# Force a trailing / if not a file
RewriteCond %{REQUEST_URI} !\..{3,4}$
RewriteRule ^(.*)([^/])$ http://%{HTTP_HOST}/$1$2/ [L,R=301]

# Redirect to php if not an existing dir
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ $1.php [L]
fgw7neuy

fgw7neuy2#

你可能会想要这样的东西:

RewriteEngine on
RewriteBase /

# redirect with trailing parameter
RewriteRule ^([\w]+).php?p=([\w]+)$ $1/$2/  [QSA,R=301]

# redirect bare php files
RewriteRule ^([\w]+).php$ $1/  [QSA,R=301]

# make sure it's not a request to an existing file
RewriteCond %{REQUEST_FILENAME} !-f

# make sure we have a trailing slash
RewriteRule ^(.+[^/])$ $1/  [QSA,R=301]

# internally point to the right file
RewriteRule ^([^/]+)/([^/]*)/?$ $1.php?p=$2 [QSA,L]

[R=301]的附件会将浏览器重定向到新的URL,并带有一个301,永久移动的状态头。这样,浏览器就可以知道在哪里找到正确的URL,而不需要询问服务器。
此外,有时.htaccess检查器也很有用:http://htaccess.madewithlove.be/请注意,该工具不适用于%{REQUEST_FILENAME}

ojsjcaue

ojsjcaue3#

如果你想让domain.com/help加载domain.com/help.php,并且仍然加载所有的jpg/png/css/img等,使用这个:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

相关问题